Global Lock across Scheduler Invocation | |
#define | RTDM_EXECUTE_ATOMICALLY(code_block) |
Execute code block atomically. | |
Spinlock with Preemption Deactivation | |
#define | RTDM_LOCK_UNLOCKED RTHAL_SPIN_LOCK_UNLOCKED |
Static lock initialisation. | |
#define | rtdm_lock_init(lock) rthal_spin_lock_init(lock) |
Dynamic lock initialisation. | |
#define | rtdm_lock_get(lock) rthal_spin_lock(lock) |
Acquire lock from non-preemptible contexts. | |
#define | rtdm_lock_put(lock) rthal_spin_unlock(lock) |
Release lock without preemption restoration. | |
#define | rtdm_lock_get_irqsave(lock, context) rthal_spin_lock_irqsave(lock, context) |
Acquire lock and disable preemption. | |
#define | rtdm_lock_put_irqrestore(lock, context) rthal_spin_unlock_irqrestore(lock, context) |
Release lock and restore preemption state. | |
#define | rtdm_lock_irqsave(context) rthal_local_irq_save(context) |
Disable preemption locally. | |
#define | rtdm_lock_irqrestore(context) rthal_local_irq_restore(context) |
Restore preemption state. | |
typedef rthal_spinlock_t | rtdm_lock_t |
Lock variable. | |
typedef unsigned long | rtdm_lockctx_t |
Variable to save the context while holding a lock. | |
Timeout Sequence Management | |
void | rtdm_toseq_init (rtdm_toseq_t *timeout_seq, nanosecs_rel_t timeout) |
Initialise a timeout sequence. | |
Event Services | |
void | rtdm_event_init (rtdm_event_t *event, unsigned long pending) |
Initialise an event. | |
void | rtdm_event_destroy (rtdm_event_t *event) |
Destroy an event. | |
void | rtdm_event_pulse (rtdm_event_t *event) |
Signal an event occurrence to currently listening waiters. | |
void | rtdm_event_signal (rtdm_event_t *event) |
Signal an event occurrence. | |
int | rtdm_event_wait (rtdm_event_t *event) |
Wait on event occurrence. | |
int | rtdm_event_timedwait (rtdm_event_t *event, nanosecs_rel_t timeout, rtdm_toseq_t *timeout_seq) |
Wait on event occurrence with timeout. | |
void | rtdm_event_clear (rtdm_event_t *event) |
Clear event state. | |
Semaphore Services | |
void | rtdm_sem_init (rtdm_sem_t *sem, unsigned long value) |
Initialise a semaphore. | |
void | rtdm_sem_destroy (rtdm_sem_t *sem) |
Destroy a semaphore. | |
int | rtdm_sem_down (rtdm_sem_t *sem) |
Decrement a semaphore. | |
int | rtdm_sem_timeddown (rtdm_sem_t *sem, nanosecs_rel_t timeout, rtdm_toseq_t *timeout_seq) |
Decrement a semaphore with timeout. | |
void | rtdm_sem_up (rtdm_sem_t *sem) |
Increment a semaphore. | |
Mutex Services | |
void | rtdm_mutex_init (rtdm_mutex_t *mutex) |
Initialise a mutex. | |
void | rtdm_mutex_destroy (rtdm_mutex_t *mutex) |
Destroy a mutex. | |
void | rtdm_mutex_unlock (rtdm_mutex_t *mutex) |
Release a mutex. | |
int | rtdm_mutex_lock (rtdm_mutex_t *mutex) |
Request a mutex. | |
int | rtdm_mutex_timedlock (rtdm_mutex_t *mutex, nanosecs_rel_t timeout, rtdm_toseq_t *timeout_seq) |
Request a mutex with timeout. |
|
Value: { \ spl_t s; \ \ xnlock_get_irqsave(&nklock, s); \ code_block; \ xnlock_put_irqrestore(&nklock, s); \ } Generally, it is illegal to suspend the current task by calling rtdm_task_sleep(), rtdm_event_wait(), etc. while holding a spinlock. In contrast, this macro allows to combine several operations including a potentially rescheduling call to an atomic code block with respect to other RTDM_EXECUTE_ATOMICALLY() blocks. The macro is a light-weight alternative for protecting code blocks via mutexes, and it can even be used to synchronise real-time and non-real-time contexts.
This service can be called from:
Rescheduling: possible, depends on functions called within code_block. |
|
Acquire lock from non-preemptible contexts.
This service can be called from:
Rescheduling: never. |
|
Acquire lock and disable preemption.
This service can be called from:
Rescheduling: never. |
|
Dynamic lock initialisation.
This service can be called from:
Rescheduling: never. |
|
Restore preemption state.
This service can be called from:
Rescheduling: possible. |
|
Disable preemption locally.
This service can be called from:
Rescheduling: never. |
|
Release lock without preemption restoration.
This service can be called from:
Rescheduling: never. |
|
Release lock and restore preemption state.
This service can be called from:
Rescheduling: possible. |
|
Clear event state.
This service can be called from:
Rescheduling: never. |
|
Destroy an event.
This service can be called from:
Rescheduling: possible. |
|
Initialise an event.
This service can be called from:
Rescheduling: never. |
|
Signal an event occurrence to currently listening waiters. This function wakes up all current waiters of the given event, but it does not change the event state. Subsequently callers of rtdm_event_wait() or rtdm_event_timedwait() will therefore be blocked first.
This service can be called from:
Rescheduling: possible. |
|
Signal an event occurrence. This function sets the given event and wakes up all current waiters. If no waiter is presently registered, the next call to rtdm_event_wait() or rtdm_event_timedwait() will return immediately.
This service can be called from:
Rescheduling: possible. |
|
Wait on event occurrence with timeout. This function waits or tests for the occurence of the given event, taking the provided timeout into account. On successful return, the event is reset.
Environments: This service can be called from:
Rescheduling: possible. |
|
Wait on event occurrence. This is the light-weight version of rtdm_event_timedwait(), implying an infinite timeout.
Environments: This service can be called from:
Rescheduling: possible. |
|
Destroy a mutex.
This service can be called from:
Rescheduling: possible. |
|
Initialise a mutex. This function initalises a basic mutex with priority inversion protection. "Basic", as it does not allow a mutex owner to recursively lock the same mutex again.
This service can be called from:
Rescheduling: never. |
|
Request a mutex. This is the light-weight version of rtdm_mutex_timedlock(), implying an infinite timeout.
Environments: This service can be called from:
Rescheduling: possible. |
|
Request a mutex with timeout. This function tries to acquire the given mutex. If it is not available, the caller is blocked unless non-blocking operation was selected.
Environments: This service can be called from:
Rescheduling: possible. |
|
Release a mutex. This function releases the given mutex, waking up a potential waiter which was blocked upon rtdm_mutex_lock() or rtdm_mutex_timedlock().
This service can be called from:
Rescheduling: possible. |
|
Destroy a semaphore.
This service can be called from:
Rescheduling: possible. |
|
Decrement a semaphore. This is the light-weight version of rtdm_sem_timeddown(), implying an infinite timeout.
Environments: This service can be called from:
Rescheduling: possible. |
|
Initialise a semaphore.
This service can be called from:
Rescheduling: never. |
|
Decrement a semaphore with timeout. This function tries to decrement the given semphore's value if it is positive on entry. If not, the caller is blocked unless non-blocking operation was selected.
Environments: This service can be called from:
Rescheduling: possible. |
|
Increment a semaphore. This function increments the given semphore's value, waking up a potential waiter which was blocked upon rtdm_sem_down().
This service can be called from:
Rescheduling: possible. |
|
Initialise a timeout sequence. This service initialises a timeout sequence handle according to the given timeout value. Timeout sequences allow to maintain a continuous timeout across multiple calls of blocking synchronisation services. A typical application scenario is given below.
int device_service_routine(...) { rtdm_toseq_t timeout_seq; ... rtdm_toseq_init(&timeout_seq, timeout); ... while (received < requested) { ret = rtdm_event_timedwait(&data_available, timeout, &timeout_seq); if (ret < 0) // including -ETIMEDOUT break; // receive some data ... } ... } timeout is restarted on every call to rtdm_event_timedwait(), potentially causing an overall delay that is larger than specified by timeout . Moreover, all functions supporting timeout sequences also interpret special timeout values (infinite and non-blocking), disburdening the driver developer from handling them separately.Environments: This service can be called from:
Rescheduling: never. |