|
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().
1.8.13