📄 thread.inl
字号:
// -------------------------------------------------------------------------// Allocate some memory at the lower end of the stack// by moving the stack limit pointer.#ifdef CYGFUN_KERNEL_THREADS_STACK_LIMIT#ifndef CYGFUN_KERNEL_THREADS_STACK_CHECKING// if stack checking, implementation is in thread.cxxinline void *Cyg_HardwareThread::increment_stack_limit( cyg_ucount32 size ){ void *ret = (void *)stack_limit; stack_limit += size; return ret;}#endif inline CYG_ADDRESSCyg_HardwareThread::get_stack_limit(){ return stack_limit;}#endif //==========================================================================// Inlines for Cyg_Thread classinline Cyg_Thread *Cyg_Thread::self(){ return Cyg_Scheduler::get_current_thread();}// -------------------------------------------------------------------------inline void Cyg_Thread::yield(){ self()->Cyg_SchedThread::yield();}// -------------------------------------------------------------------------inline voidCyg_Thread::rotate_queue( cyg_priority pri ){ self()->Cyg_SchedThread::rotate_queue( pri );}// -------------------------------------------------------------------------inline voidCyg_Thread::to_queue_head( void ){ this->Cyg_SchedThread::to_queue_head();}// -------------------------------------------------------------------------#ifdef CYGIMP_THREAD_PRIORITYinline cyg_priority Cyg_Thread::get_priority(){#ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_SIMPLE // If we have an inherited priority, return our original // priority rather than the current one. if( priority_inherited ) return original_priority;#endif return priority;}// Return the actual dispatching priority of the thread// regardless of inheritance or scheduling concerns.inline cyg_priority Cyg_Thread::get_current_priority(){ return priority;}#endif// -------------------------------------------------------------------------inline void Cyg_Thread::set_sleep_reason( cyg_reason reason){ self()->sleep_reason = reason; self()->wake_reason = NONE;}// -------------------------------------------------------------------------inline Cyg_Thread::cyg_reason Cyg_Thread::get_sleep_reason(){ return sleep_reason;}// -------------------------------------------------------------------------inline void Cyg_Thread::set_wake_reason( cyg_reason reason ){ sleep_reason = NONE; wake_reason = reason;}// -------------------------------------------------------------------------inline Cyg_Thread::cyg_reason Cyg_Thread::get_wake_reason(){ return wake_reason;}// -------------------------------------------------------------------------inline void Cyg_Thread::set_timer( cyg_tick_count trigger, cyg_reason reason){#ifdef CYGFUN_KERNEL_THREADS_TIMER self()->sleep_reason = reason; self()->wake_reason = NONE; self()->timer.initialize( trigger);#endif}// -------------------------------------------------------------------------inline void Cyg_Thread::clear_timer(){#ifdef CYGFUN_KERNEL_THREADS_TIMER self()->timer.disable();#endif}// -------------------------------------------------------------------------#ifdef CYGVAR_KERNEL_THREADS_DATAinline CYG_ADDRWORD Cyg_Thread::get_data( Cyg_Thread::cyg_data_index index ){ CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX, "Per thread data index out of bounds"); CYG_ASSERT( (thread_data_map & (1<<index)) == 0, "Unallocated index used"); return self()->thread_data[index];}inline CYG_ADDRWORD *Cyg_Thread::get_data_ptr( Cyg_Thread::cyg_data_index index ){ CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX, "Per thread data index out of bounds"); CYG_ASSERT( (thread_data_map & (1<<index)) == 0, "Unallocated index used"); return &(self()->thread_data[index]);}inline void Cyg_Thread::set_data( Cyg_Thread::cyg_data_index index, CYG_ADDRWORD data ){ CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX, "Per thread data index out of bounds"); CYG_ASSERT( (thread_data_map & (1<<index)) == 0, "Unallocated index used"); thread_data[index] = data;}#endif// -------------------------------------------------------------------------#ifdef CYGPKG_KERNEL_THREADS_DESTRUCTORS// Add and remove destructors. Returns true on success, false on failure.inline cyg_boolCyg_Thread::add_destructor( destructor_fn fn, CYG_ADDRWORD data ){ cyg_ucount16 i;#ifndef CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD Cyg_Scheduler::lock();#endif for (i=0; i<CYGNUM_KERNEL_THREADS_DESTRUCTORS; i++) { if (NULL == destructors[i].fn) { destructors[i].data = data; destructors[i].fn = fn;#ifndef CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD Cyg_Scheduler::unlock();#endif return true; } }#ifndef CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD Cyg_Scheduler::unlock();#endif return false;}inline cyg_boolCyg_Thread::rem_destructor( destructor_fn fn, CYG_ADDRWORD data ){ cyg_ucount16 i;#ifndef CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD Cyg_Scheduler::lock();#endif for (i=0; i<CYGNUM_KERNEL_THREADS_DESTRUCTORS; i++) { if (destructors[i].fn == fn && destructors[i].data == data) { destructors[i].fn = NULL;#ifndef CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD Cyg_Scheduler::unlock();#endif return true; } }#ifndef CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD Cyg_Scheduler::unlock();#endif return false;}#endif// -------------------------------------------------------------------------#ifdef CYGVAR_KERNEL_THREADS_NAMEinline char *Cyg_Thread::get_name(){ return name;}#endif// -------------------------------------------------------------------------#ifdef CYGVAR_KERNEL_THREADS_LISTinline Cyg_Thread *Cyg_Thread::get_list_head(){ return thread_list?thread_list->list_next:0;} inline Cyg_Thread *Cyg_Thread::get_list_next(){ return (this==thread_list)?0:list_next;}#endif// -------------------------------------------------------------------------#ifdef CYGPKG_KERNEL_EXCEPTIONSinline void Cyg_Thread::register_exception( cyg_code exception_number, // exception number cyg_exception_handler handler, // handler function CYG_ADDRWORD data, // data argument cyg_exception_handler **old_handler, // handler function CYG_ADDRWORD *old_data // data argument ){ self()->exception_control.register_exception( exception_number, handler, data, old_handler, old_data );}inline void Cyg_Thread::deregister_exception( cyg_code exception_number // exception number ){ self()->exception_control.deregister_exception( exception_number );}#endif//==========================================================================// Inlines for Cyg_ThreadTimer class// -------------------------------------------------------------------------#if defined(CYGFUN_KERNEL_THREADS_TIMER) && defined(CYGVAR_KERNEL_COUNTERS_CLOCK)inline Cyg_ThreadTimer::Cyg_ThreadTimer( Cyg_Thread *th ) : Cyg_Alarm(Cyg_Clock::real_time_clock, &alarm, CYG_ADDRWORD(this) ){ thread = th;}#endif//==========================================================================// Inlines for Cyg_ThreadQueue classinline void Cyg_ThreadQueue::enqueue(Cyg_Thread *thread){ Cyg_ThreadQueue_Implementation::enqueue(thread);}// -------------------------------------------------------------------------inline Cyg_Thread *Cyg_ThreadQueue::highpri(){ return Cyg_ThreadQueue_Implementation::highpri();}// -------------------------------------------------------------------------inline Cyg_Thread *Cyg_ThreadQueue::dequeue(){ return Cyg_ThreadQueue_Implementation::dequeue();}// -------------------------------------------------------------------------inline void Cyg_ThreadQueue::remove(Cyg_Thread *thread){ Cyg_ThreadQueue_Implementation::remove(thread);}// -------------------------------------------------------------------------inline cyg_bool Cyg_ThreadQueue::empty(){ return Cyg_ThreadQueue_Implementation::empty();}// -------------------------------------------------------------------------#endif // ifndef CYGONCE_KERNEL_THREAD_INL// EOF thread.inl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -