コード例 #1
0
ファイル: threadhandler.c プロジェクト: chch1028/rtems
  static bool _Thread_Handler_is_constructor_execution_required(
    Thread_Control *executing
  )
  {
    static bool doneConstructors;
    bool doCons = false;

    #if defined(RTEMS_SMP)
      static SMP_lock_Control constructor_lock = SMP_LOCK_INITIALIZER;

      if ( !doneConstructors ) {
        _SMP_lock_Acquire( &constructor_lock );
    #endif

    #if defined(RTEMS_MULTIPROCESSING)
      doCons = !doneConstructors
        && _Objects_Get_API( executing->Object.id ) != OBJECTS_INTERNAL_API;
      if (doCons)
        doneConstructors = true;
    #else
      (void) executing;
      doCons = !doneConstructors;
      doneConstructors = true;
    #endif

    #if defined(RTEMS_SMP)
        _SMP_lock_Release( &constructor_lock );
      }
    #endif

    return doCons;
  }
コード例 #2
0
static void _Giant_Do_release( Per_CPU_Control *self_cpu )
{
  Giant_Control *giant = &_Giant;

  --giant->nest_level;
  if ( giant->nest_level == 0 ) {
    giant->owner_cpu = NO_OWNER_CPU;
    _SMP_lock_Release( &giant->lock, &self_cpu->Giant_lock_context );
  }
}
コード例 #3
0
static void _Giant_Do_release( void )
{
  Giant_Control *giant = &_Giant;

  --giant->nest_level;
  if ( giant->nest_level == 0 ) {
    giant->owner_cpu = NO_OWNER_CPU;
    _SMP_lock_Release( &giant->lock );
  }
}
コード例 #4
0
void _Giant_Drop( Per_CPU_Control *self_cpu )
{
  Giant_Control *giant = &_Giant;
  uint32_t self_cpu_index = _Per_CPU_Get_index( self_cpu );

  _Assert( _ISR_Get_level() != 0 );

  if ( giant->owner_cpu == self_cpu_index ) {
    giant->nest_level = 0;
    giant->owner_cpu = NO_OWNER_CPU;
    _SMP_lock_Release( &giant->lock, &self_cpu->Giant_lock_context );
  }
}