RTEMS CPU Kit with SuperCore
4.11.2
|
This handler encapsulates functionality which provides the foundation Mutex services used in all of the APIs supported by RTEMS. More...
![]() |
Files | |
file | coremuteximpl.h |
CORE Mutex Implementation. | |
file | coremutex.c |
Initialize a Core Mutex. | |
file | coremutexflush.c |
Flush all waiting threads. | |
file | coremutexseize.c |
Seize Mutex with Blocking. | |
file | coremutexseizeintr.c |
Trylock CORE Mutex Seize Interrupt. | |
file | coremutexsurrender.c |
Surrender the Mutex. | |
Data Structures | |
struct | CORE_mutex_Attributes |
The control block used to manage attributes of each mutex. More... | |
struct | CORE_mutex_Control |
Control block used to manage each mutex. More... | |
Macros | |
#define | CORE_MUTEX_STATUS_LAST CORE_MUTEX_STATUS_CEILING_VIOLATED |
The last status value. More... | |
#define | _CORE_mutex_Seize_interrupt_trylock(_mutex, _executing, _lock_context) _CORE_mutex_Seize_interrupt_trylock_body( _mutex, _executing, _lock_context ) |
The default is to favor speed and inlining this definitely saves a few instructions. More... | |
#define | _CORE_mutex_Check_dispatch_for_seize(_wait) |
Verifies that a mutex blocking seize is performed safely. More... | |
#define | _CORE_mutex_Seize(_the_mutex, _executing, _id, _wait, _timeout, _lock_context) |
This method is used to obtain a core mutex. More... | |
Typedefs | |
typedef void(* | CORE_mutex_API_mp_support_callout) (Thread_Control *, Objects_Id) |
Callout which provides to support global/multiprocessor operations. More... | |
Enumerations | |
enum | CORE_mutex_Disciplines { CORE_MUTEX_DISCIPLINES_FIFO, CORE_MUTEX_DISCIPLINES_PRIORITY, CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT, CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING } |
The blocking disciplines for a mutex. More... | |
enum | CORE_mutex_Nesting_behaviors { CORE_MUTEX_NESTING_ACQUIRES, CORE_MUTEX_NESTING_BLOCKS } |
The possible behaviors for lock nesting. More... | |
enum | CORE_mutex_Status { CORE_MUTEX_STATUS_SUCCESSFUL, CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT, CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE, CORE_MUTEX_WAS_DELETED, CORE_MUTEX_TIMEOUT, CORE_MUTEX_STATUS_CEILING_VIOLATED } |
The possible Mutex handler return statuses. More... | |
This handler encapsulates functionality which provides the foundation Mutex services used in all of the APIs supported by RTEMS.
#define _CORE_mutex_Check_dispatch_for_seize | ( | _wait | ) |
Verifies that a mutex blocking seize is performed safely.
This macro is to verify that a mutex blocking seize is performed from a safe system state. For example, one cannot block inside an isr.
this | method returns true if dispatch is in an unsafe state. |
#define _CORE_mutex_Seize | ( | _the_mutex, | |
_executing, | |||
_id, | |||
_wait, | |||
_timeout, | |||
_lock_context | |||
) |
This method is used to obtain a core mutex.
[in] | _the_mutex | is the mutex to attempt to lock |
[in] | _executing | The currently executing thread. |
[in] | _id | is the Id of the owning API level Semaphore object |
[in] | _wait | is true if the thread is willing to wait |
[in] | _timeout | is the maximum number of ticks to block |
[in] | _lock_context | is a temporary variable used to contain the ISR disable level cookie |
#define _CORE_mutex_Seize_interrupt_trylock | ( | _mutex, | |
_executing, | |||
_lock_context | |||
) | _CORE_mutex_Seize_interrupt_trylock_body( _mutex, _executing, _lock_context ) |
The default is to favor speed and inlining this definitely saves a few instructions.
This is very important for mutex performance.
[in] | _mutex | will attempt to lock |
[in] | _executing | points to the executing thread |
[in] | _lock_context | is the interrupt level |
#define CORE_MUTEX_STATUS_LAST CORE_MUTEX_STATUS_CEILING_VIOLATED |
The last status value.
This is the last status value.
Referenced by _POSIX_Mutex_Translate_core_mutex_return_code().
typedef void( * CORE_mutex_API_mp_support_callout) (Thread_Control *, Objects_Id) |
Callout which provides to support global/multiprocessor operations.
The following type defines the callout which the API provides to support global/multiprocessor operations on mutexes.
The blocking disciplines for a mutex.
This enumerated type defines the blocking disciplines for a mutex.
The possible behaviors for lock nesting.
This enumerated type defines the possible behaviors for lock nesting.
enum CORE_mutex_Status |
The possible Mutex handler return statuses.
This enumerated type defines the possible Mutex handler return statuses.
void _CORE_mutex_Flush | ( | CORE_mutex_Control * | the_mutex, |
Thread_queue_Flush_callout | remote_extract_callout, | ||
uint32_t | status | ||
) |
Flush all waiting threads.
This routine assists in the deletion of a mutex by flushing the associated wait queue.
[in] | the_mutex | is the mutex to flush |
[in] | remote_extract_callout | is the routine to invoke when a remote thread is extracted |
[in] | status | is the status value which each unblocked thread will return to its caller. |
CORE_mutex_Status _CORE_mutex_Initialize | ( | CORE_mutex_Control * | the_mutex, |
Thread_Control * | executing, | ||
const CORE_mutex_Attributes * | the_mutex_attributes, | ||
bool | initially_locked | ||
) |
Initializes the mutex based on the parameters passed.
This routine initializes the mutex based on the parameters passed.
[in,out] | the_mutex | is the mutex to initalize |
[in,out] | executing | The currently executing thread. |
[in] | the_mutex_attributes | is the attributes associated with this mutex instance |
[in] | initially_locked | If true, then the mutex is initially locked by the executing thread. |
This | method returns CORE_MUTEX_STATUS_SUCCESSFUL if successful. |
References _Chain_Prepend_unprotected(), _CORE_mutex_Is_fifo(), _CORE_mutex_Is_inherit_priority(), _CORE_mutex_Is_priority_ceiling(), _Thread_Dispatch_disable(), _Thread_Dispatch_enable(), _Thread_queue_Initialize(), _Thread_Raise_priority(), CORE_mutex_Control::Attributes, CORE_MUTEX_STATUS_CEILING_VIOLATED, Thread_Control::current_priority, CORE_mutex_Control::holder, CORE_mutex_Control::nest_count, CORE_mutex_Attributes::priority_ceiling, Thread_Control::resource_count, and CORE_mutex_Control::Wait_queue.
Referenced by _API_Mutex_Allocate(), and rtems_semaphore_create().
RTEMS_INLINE_ROUTINE bool _CORE_mutex_Is_fifo | ( | const CORE_mutex_Attributes * | the_attribute | ) |
Does core mutex use FIFO blocking.
This routine returns true if the mutex's wait discipline is FIFO and false otherwise.
[in] | the_attribute | is the attribute set of the mutex. |
true | The mutex is using FIFO blocking order. |
false | The mutex is not using FIFO blocking order. |
References CORE_MUTEX_DISCIPLINES_FIFO, and CORE_mutex_Attributes::discipline.
Referenced by _CORE_mutex_Initialize().
RTEMS_INLINE_ROUTINE bool _CORE_mutex_Is_inherit_priority | ( | CORE_mutex_Attributes * | the_attribute | ) |
Does mutex use priority inheritance.
This routine returns true if the mutex's wait discipline is INHERIT_PRIORITY and false otherwise.
[in] | the_attribute | is the attribute set of the mutex. |
true | The mutex is using priority inheritance. |
false | The mutex is not using priority inheritance. |
References CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT, and CORE_mutex_Attributes::discipline.
Referenced by _CORE_mutex_Initialize(), and _CORE_mutex_Seize_interrupt_trylock_body().
RTEMS_INLINE_ROUTINE bool _CORE_mutex_Is_locked | ( | const CORE_mutex_Control * | the_mutex | ) |
Is mutex locked.
This routine returns true if the mutex specified is locked and false otherwise.
[in] | the_mutex | is the mutex to check. |
true | The mutex is locked. |
false | The mutex is not locked. |
References CORE_mutex_Control::holder.
Referenced by _CORE_mutex_Seize_interrupt_trylock_body().
RTEMS_INLINE_ROUTINE bool _CORE_mutex_Is_priority | ( | CORE_mutex_Attributes * | the_attribute | ) |
Doex core mutex use priority blocking.
This routine returns true if the mutex's wait discipline is PRIORITY and false otherwise.
[in] | the_attribute | is the attribute set of the mutex. |
true | The mutex is using priority blocking order. |
false | The mutex is not using priority blocking order. |
References CORE_MUTEX_DISCIPLINES_PRIORITY, and CORE_mutex_Attributes::discipline.
RTEMS_INLINE_ROUTINE bool _CORE_mutex_Is_priority_ceiling | ( | CORE_mutex_Attributes * | the_attribute | ) |
Does mutex use priority ceiling.
This routine returns true if the mutex's wait discipline is PRIORITY_CEILING and false otherwise.
[in] | the_attribute | is the attribute set of the mutex. |
true | The mutex is using priority ceiling. |
false | The mutex is not using priority ceiling. |
References CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING, and CORE_mutex_Attributes::discipline.
Referenced by _CORE_mutex_Initialize(), and _CORE_mutex_Seize_interrupt_trylock_body().
RTEMS_INLINE_ROUTINE void _CORE_mutex_Seize_body | ( | CORE_mutex_Control * | the_mutex, |
Thread_Control * | executing, | ||
Objects_Id | id, | ||
bool | wait, | ||
Watchdog_Interval | timeout, | ||
ISR_lock_Context * | lock_context | ||
) |
Attempt to obtain the mutex.
This routine attempts to obtain the mutex. If the mutex is available, then it will return immediately. Otherwise, it will invoke the support routine _Core_mutex_Seize_interrupt_blocking.
[in] | the_mutex | is the mutex to attempt to lock |
[in] | id | is the Id of the owning API level Semaphore object |
[in] | wait | is true if the thread is willing to wait |
[in] | timeout | is the maximum number of ticks to block |
[in] | lock_context | is a temporary variable used to contain the ISR disable level cookie |
The logic on this routine is as follows:
void _CORE_mutex_Seize_interrupt_blocking | ( | CORE_mutex_Control * | the_mutex, |
Thread_Control * | executing, | ||
Watchdog_Interval | timeout, | ||
ISR_lock_Context * | lock_context | ||
) |
Performs the blocking portion of a mutex obtain.
This routine performs the blocking portion of a mutex obtain. It is an actual subroutine and is not implemented as something that may be inlined.
[in,out] | the_mutex | is the mutex to attempt to lock |
[in,out] | executing | The currently executing thread. |
[in] | timeout | is the maximum number of ticks to block |
[in] | lock_context | is the interrupt level |
RTEMS_INLINE_ROUTINE int _CORE_mutex_Seize_interrupt_trylock_body | ( | CORE_mutex_Control * | the_mutex, |
Thread_Control * | executing, | ||
ISR_lock_Context * | lock_context | ||
) |
Attempt to receive a unit from the_mutex.
This routine attempts to receive a unit from the_mutex. If a unit is available or if the wait flag is false, then the routine returns. Otherwise, the calling task is blocked until a unit becomes available.
[in,out] | executing | The currently executing thread. |
[in,out] | the_mutex | is the mutex to attempt to lock |
[in] | lock_context | is the interrupt level |
This | routine returns 0 if "trylock" can resolve whether or not the mutex is immediately obtained or there was an error attempting to get it. It returns 1 to indicate that the caller cannot obtain the mutex and will have to block to do so. |
References _Chain_Prepend_unprotected(), _CORE_mutex_Is_inherit_priority(), _CORE_mutex_Is_locked(), _CORE_mutex_Is_priority_ceiling(), CORE_mutex_Control::Attributes, CORE_MUTEX_STATUS_SUCCESSFUL, Thread_Control::current_priority, CORE_mutex_Control::holder, CORE_mutex_Control::nest_count, Thread_Control::resource_count, Thread_Wait_information::return_code, and Thread_Control::Wait.
CORE_mutex_Status _CORE_mutex_Surrender | ( | CORE_mutex_Control * | the_mutex, |
Objects_Id | id, | ||
CORE_mutex_API_mp_support_callout | api_mutex_mp_support, | ||
ISR_lock_Context * | lock_context | ||
) |
Frees a unit to the mutex.
This routine frees a unit to the mutex. If a task was blocked waiting for a unit from this mutex, then that task will be readied and the unit given to that task. Otherwise, the unit will be returned to the mutex.
[in] | the_mutex | is the mutex to surrender |
[in] | id | is the id of the RTEMS Object associated with this mutex |
[in] | api_mutex_mp_support | is the routine that will be called when unblocking a remote mutex |
[in] | lock_context | is the interrupt level |
an | indication of whether the routine succeeded or failed |
References _ISR_lock_ISR_enable, _Thread_Is_executing(), CORE_mutex_Control::Attributes, CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE, CORE_mutex_Control::holder, and CORE_mutex_Attributes::only_owner_release.
Referenced by _API_Mutex_Unlock().