int _Mutex_Try_acquire( struct _Mutex_Control *_mutex ) { Mutex_Control *mutex; Thread_queue_Context queue_context; ISR_Level level; Thread_Control *executing; Thread_Control *owner; int eno; mutex = _Mutex_Get( _mutex ); _Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Context_ISR_disable( &queue_context, level ); executing = _Mutex_Queue_acquire_critical( mutex, &queue_context ); owner = mutex->Queue.Queue.owner; if ( __predict_true( owner == NULL ) ) { mutex->Queue.Queue.owner = executing; _Thread_Resource_count_increment( executing ); eno = 0; } else { eno = EBUSY; } _Mutex_Queue_release( mutex, level, &queue_context ); return eno; }
int _Mutex_Try_acquire( struct _Mutex_Control *_mutex ) { Mutex_Control *mutex; ISR_lock_Context lock_context; Thread_Control *executing; Thread_Control *owner; int success; mutex = _Mutex_Get( _mutex ); executing = _Mutex_Queue_acquire( mutex, &lock_context ); owner = mutex->owner; if ( __predict_true( owner == NULL ) ) { mutex->owner = executing; ++executing->resource_count; success = 1; } else { success = 0; } _Mutex_Queue_release( mutex, &lock_context ); return success; }
int _Mutex_Try_acquire( struct _Mutex_Control *_mutex ) { Mutex_Control *mutex; Thread_queue_Context queue_context; Thread_Control *executing; Thread_Control *owner; int eno; mutex = _Mutex_Get( _mutex ); _Thread_queue_Context_initialize( &queue_context ); executing = _Mutex_Queue_acquire( mutex, &queue_context ); owner = mutex->Queue.Queue.owner; if ( __predict_true( owner == NULL ) ) { mutex->Queue.Queue.owner = executing; ++executing->resource_count; eno = 0; } else { eno = EBUSY; } _Mutex_Queue_release( mutex, &queue_context ); return eno; }
void _Mutex_Release( struct _Mutex_Control *_mutex ) { Mutex_Control *mutex; ISR_lock_Context lock_context; Thread_Control *executing; mutex = _Mutex_Get( _mutex ); executing = _Mutex_Queue_acquire( mutex, &lock_context ); _Assert( mutex->owner == executing ); _Mutex_Release_critical( mutex, executing, &lock_context ); }
void _Mutex_Release( struct _Mutex_Control *_mutex ) { Mutex_Control *mutex; Thread_queue_Context queue_context; Thread_Control *executing; mutex = _Mutex_Get( _mutex ); _Thread_queue_Context_initialize( &queue_context ); executing = _Mutex_Queue_acquire( mutex, &queue_context ); _Assert( mutex->Queue.Queue.owner == executing ); _Mutex_Release_critical( mutex, executing, &queue_context ); }
int _Mutex_Acquire_timed( struct _Mutex_Control *_mutex, const struct timespec *abstime ) { Mutex_Control *mutex; Thread_queue_Context queue_context; ISR_Level level; Thread_Control *executing; Thread_Control *owner; mutex = _Mutex_Get( _mutex ); _Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Context_ISR_disable( &queue_context, level ); executing = _Mutex_Queue_acquire_critical( mutex, &queue_context ); owner = mutex->Queue.Queue.owner; if ( __predict_true( owner == NULL ) ) { mutex->Queue.Queue.owner = executing; _Thread_Resource_count_increment( executing ); _Mutex_Queue_release( mutex, level, &queue_context ); return 0; } else { Watchdog_Interval ticks; switch ( _TOD_Absolute_timeout_to_ticks( abstime, CLOCK_REALTIME, &ticks ) ) { case TOD_ABSOLUTE_TIMEOUT_INVALID: _Mutex_Queue_release( mutex, level, &queue_context ); return EINVAL; case TOD_ABSOLUTE_TIMEOUT_IS_IN_PAST: case TOD_ABSOLUTE_TIMEOUT_IS_NOW: _Mutex_Queue_release( mutex, level, &queue_context ); return ETIMEDOUT; default: break; } _Thread_queue_Context_set_relative_timeout( &queue_context, ticks ); _Mutex_Acquire_slow( mutex, owner, executing, level, &queue_context ); return STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) ); } }
int _Mutex_Acquire_timed( struct _Mutex_Control *_mutex, const struct timespec *abstime ) { Mutex_Control *mutex; ISR_lock_Context lock_context; Thread_Control *executing; Thread_Control *owner; mutex = _Mutex_Get( _mutex ); executing = _Mutex_Queue_acquire( mutex, &lock_context ); owner = mutex->owner; ++executing->resource_count; if ( __predict_true( owner == NULL ) ) { mutex->owner = executing; _Mutex_Queue_release( mutex, &lock_context ); return 0; } else { Watchdog_Interval ticks; switch ( _TOD_Absolute_timeout_to_ticks( abstime, &ticks ) ) { case TOD_ABSOLUTE_TIMEOUT_INVALID: _Mutex_Queue_release( mutex, &lock_context ); return EINVAL; case TOD_ABSOLUTE_TIMEOUT_IS_IN_PAST: case TOD_ABSOLUTE_TIMEOUT_IS_NOW: _Mutex_Queue_release( mutex, &lock_context ); return ETIMEDOUT; default: break; } executing->Wait.return_code = 0; _Mutex_Acquire_slow( mutex, owner, executing, ticks, &lock_context ); return (int) executing->Wait.return_code; } }
void _Mutex_Acquire( struct _Mutex_Control *_mutex ) { Mutex_Control *mutex; ISR_lock_Context lock_context; Thread_Control *executing; Thread_Control *owner; mutex = _Mutex_Get( _mutex ); executing = _Mutex_Queue_acquire( mutex, &lock_context ); owner = mutex->owner; ++executing->resource_count; if ( __predict_true( owner == NULL ) ) { mutex->owner = executing; _Mutex_Queue_release( mutex, &lock_context ); } else { _Mutex_Acquire_slow( mutex, owner, executing, 0, &lock_context ); } }
void _Mutex_Acquire( struct _Mutex_Control *_mutex ) { Mutex_Control *mutex; Thread_queue_Context queue_context; Thread_Control *executing; Thread_Control *owner; mutex = _Mutex_Get( _mutex ); _Thread_queue_Context_initialize( &queue_context ); executing = _Mutex_Queue_acquire( mutex, &queue_context ); owner = mutex->Queue.Queue.owner; if ( __predict_true( owner == NULL ) ) { mutex->Queue.Queue.owner = executing; ++executing->resource_count; _Mutex_Queue_release( mutex, &queue_context ); } else { _Thread_queue_Context_set_no_timeout( &queue_context ); _Mutex_Acquire_slow( mutex, owner, executing, &queue_context ); } }
void _Mutex_Acquire( struct _Mutex_Control *_mutex ) { Mutex_Control *mutex; Thread_queue_Context queue_context; ISR_Level level; Thread_Control *executing; Thread_Control *owner; mutex = _Mutex_Get( _mutex ); _Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Context_ISR_disable( &queue_context, level ); executing = _Mutex_Queue_acquire_critical( mutex, &queue_context ); owner = mutex->Queue.Queue.owner; if ( __predict_true( owner == NULL ) ) { mutex->Queue.Queue.owner = executing; _Thread_Resource_count_increment( executing ); _Mutex_Queue_release( mutex, level, &queue_context ); } else { _Thread_queue_Context_set_no_timeout( &queue_context ); _Mutex_Acquire_slow( mutex, owner, executing, level, &queue_context ); } }