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; }
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 ); } }
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 ); } }
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 ); } }