⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thread.inl

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 INL
字号:
/*  thread.inl * *  This file contains the macro implementation of the inlined *  routines from the Thread handler. * *  COPYRIGHT (c) 1989-1999. *  On-Line Applications Research Corporation (OAR). * *  The license and distribution terms for this file may be *  found in the file LICENSE in this distribution or at *  http://www.rtems.com/license/LICENSE. * *  $Id: thread.inl,v 1.17.2.3 2006/03/07 20:47:24 joel Exp $ */#ifndef __THREAD_inl#define __THREAD_inl/*PAGE * *  _Thread_Stop_multitasking * *  DESCRIPTION: * *  This routine halts multitasking and returns control to *  the "thread" (i.e. the BSP) which initially invoked the *  routine which initialized the system. */RTEMS_INLINE_ROUTINE void _Thread_Stop_multitasking( void ){  _Context_Switch( &_Thread_Executing->Registers, &_Thread_BSP_context );}/*PAGE * *  _Thread_Is_executing * *  DESCRIPTION: * *  This function returns TRUE if the_thread is the currently executing *  thread, and FALSE otherwise. */RTEMS_INLINE_ROUTINE boolean _Thread_Is_executing (  Thread_Control *the_thread){  return ( the_thread == _Thread_Executing );}/*PAGE * *  _Thread_Is_heir * *  DESCRIPTION: * *  This function returns TRUE if the_thread is the heir *  thread, and FALSE otherwise. */RTEMS_INLINE_ROUTINE boolean _Thread_Is_heir (  Thread_Control *the_thread){  return ( the_thread == _Thread_Heir );}/*PAGE * *  _Thread_Is_executing_also_the_heir * *  DESCRIPTION: * *  This function returns TRUE if the currently executing thread *  is also the heir thread, and FALSE otherwise. */RTEMS_INLINE_ROUTINE boolean _Thread_Is_executing_also_the_heir( void ){  return ( _Thread_Executing == _Thread_Heir );}/*PAGE * *  _Thread_Unblock * *  DESCRIPTION: * *  This routine clears any blocking state for the_thread.  It performs *  any necessary scheduling operations including the selection of *  a new heir thread. */RTEMS_INLINE_ROUTINE void _Thread_Unblock (  Thread_Control *the_thread){  _Thread_Clear_state( the_thread, STATES_BLOCKED );}/*PAGE * *  _Thread_Restart_self * *  DESCRIPTION: * *  This routine resets the current context of the calling thread *  to that of its initial state. */RTEMS_INLINE_ROUTINE void _Thread_Restart_self( void ){#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )  if ( _Thread_Executing->fp_context != NULL )    _Context_Restore_fp( &_Thread_Executing->fp_context );#endif  _CPU_Context_Restart_self( &_Thread_Executing->Registers );}/*PAGE * *  _Thread_Calculate_heir * *  DESCRIPTION: * *  This function returns a pointer to the highest priority *  ready thread. */RTEMS_INLINE_ROUTINE void _Thread_Calculate_heir( void ){  _Thread_Heir = (Thread_Control *)    _Thread_Ready_chain[ _Priority_Get_highest() ].first;}/*PAGE * *  _Thread_Is_allocated_fp * *  DESCRIPTION: * *  This function returns TRUE if the floating point context of *  the_thread is currently loaded in the floating point unit, and *  FALSE otherwise. */#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )RTEMS_INLINE_ROUTINE boolean _Thread_Is_allocated_fp (  Thread_Control *the_thread){  return ( the_thread == _Thread_Allocated_fp );}#endif/*PAGE * *  _Thread_Deallocate_fp * *  DESCRIPTION: * *  This routine is invoked when the currently loaded floating *  point context is now longer associated with an active thread. */#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )RTEMS_INLINE_ROUTINE void _Thread_Deallocate_fp( void ){  _Thread_Allocated_fp = NULL;}#endif/*PAGE * *  _Thread_Disable_dispatch * *  DESCRIPTION: * *  This routine prevents dispatching. */RTEMS_INLINE_ROUTINE void _Thread_Disable_dispatch( void ){  _Thread_Dispatch_disable_level += 1;  RTEMS_COMPILER_MEMORY_BARRIER();}/*PAGE * *  _Thread_Enable_dispatch * *  DESCRIPTION: * *  This routine allows dispatching to occur again.  If this is *  the outer most dispatching critical section, then a dispatching *  operation will be performed and, if necessary, control of the *  processor will be transferred to the heir thread. */#if ( CPU_INLINE_ENABLE_DISPATCH == TRUE )RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch(){  RTEMS_COMPILER_MEMORY_BARRIER();  if ( (--_Thread_Dispatch_disable_level) == 0 )    _Thread_Dispatch();}#endif#if ( CPU_INLINE_ENABLE_DISPATCH == FALSE )void _Thread_Enable_dispatch( void );#endif/*PAGE * *  _Thread_Unnest_dispatch * *  DESCRIPTION: * *  This routine allows dispatching to occur again.  However, *  no dispatching operation is performed even if this is the outer *  most dispatching critical section. */RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ){  RTEMS_COMPILER_MEMORY_BARRIER();  _Thread_Dispatch_disable_level -= 1;}/*PAGE * *  _Thread_Is_dispatching_enabled * *  DESCRIPTION: * *  This function returns TRUE if dispatching is disabled, and FALSE *  otherwise. */RTEMS_INLINE_ROUTINE boolean _Thread_Is_dispatching_enabled( void ){  return ( _Thread_Dispatch_disable_level == 0 );}/*PAGE * *  _Thread_Is_context_switch_necessary * *  DESCRIPTION: * *  This function returns TRUE if dispatching is disabled, and FALSE *  otherwise. */RTEMS_INLINE_ROUTINE boolean _Thread_Is_context_switch_necessary( void ){  return ( _Context_Switch_necessary );}/*PAGE * *  _Thread_Dispatch_initialization * *  DESCRIPTION: * *  This routine initializes the thread dispatching subsystem. */RTEMS_INLINE_ROUTINE void _Thread_Dispatch_initialization( void ){  _Thread_Dispatch_disable_level = 1;}/*PAGE * *  _Thread_Is_null * *  DESCRIPTION: * *  This function returns TRUE if the_thread is NULL and FALSE otherwise. */RTEMS_INLINE_ROUTINE boolean _Thread_Is_null (  Thread_Control *the_thread){  return ( the_thread == NULL );}/*PAGE * *  _Thread_Get * *  DESCRIPTION: * *  This function maps thread IDs to thread control *  blocks.  If ID corresponds to a local thread, then it *  returns the_thread control pointer which maps to ID *  and location is set to OBJECTS_LOCAL.  If the thread ID is *  global and resides on a remote node, then location is set *  to OBJECTS_REMOTE, and the_thread is undefined. *  Otherwise, location is set to OBJECTS_ERROR and *  the_thread is undefined. * *  NOTE:  XXX... This routine may be able to be optimized. */RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Get (  Objects_Id         id,  Objects_Locations *location){  unsigned32           the_api;  unsigned32           the_class;  Objects_Information *information;  Thread_Control      *tp = (Thread_Control *) 0;   if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {    _Thread_Disable_dispatch();    *location = OBJECTS_LOCAL;    tp = _Thread_Executing;    goto done;  }   the_api = _Objects_Get_API( id );  if ( the_api && the_api > OBJECTS_APIS_LAST ) {    *location = OBJECTS_ERROR;    goto done;  }    the_class = _Objects_Get_class( id );  if ( the_class != 1 ) {       /* threads are always first class :) */    *location = OBJECTS_ERROR;    goto done;  }   information = _Objects_Information_table[ the_api ][ the_class ];   if ( !information ) {    *location = OBJECTS_ERROR;    goto done;  }   tp = (Thread_Control *) _Objects_Get( information, id, location ); done:  return tp;}/* *  _Thread_Is_proxy_blocking * *  DESCRIPTION: * *  This function returns TRUE if the status code is equal to the *  status which indicates that a proxy is blocking, and FALSE otherwise. */RTEMS_INLINE_ROUTINE boolean _Thread_Is_proxy_blocking (  unsigned32 code){  return (code == THREAD_STATUS_PROXY_BLOCKING);}/*PAGE * *  _Thread_Internal_allocate * *  DESCRIPTION: * *  This routine allocates an internal thread. */ RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Internal_allocate( void ){  return (Thread_Control *) _Objects_Allocate( &_Thread_Internal_information );} /*PAGE * *  _Thread_Internal_free * *  DESCRIPTION: * *  This routine frees an internal thread. */ RTEMS_INLINE_ROUTINE void _Thread_Internal_free (  Thread_Control *the_task){  _Objects_Free( &_Thread_Internal_information, &the_task->Object );}/*PAGE * *  _Thread_Get_libc_reent * *  DESCRIPTION: * *  This routine returns the C library re-enterant pointer. */ RTEMS_INLINE_ROUTINE struct _reent **_Thread_Get_libc_reent( void ){  return _Thread_libc_reent;}/*PAGE * *  _Thread_Set_libc_reent * *  DESCRIPTION: * *  This routine set the C library re-enterant pointer. */ RTEMS_INLINE_ROUTINE void _Thread_Set_libc_reent (  struct _reent **libc_reent){  _Thread_libc_reent = libc_reent;}#endif/* end of include file */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -