lfn
serial
ticket/834-toolchain-update
topic/msim-upgrade
topic/simplify-dev-export
Last change
on this file since 6de65f3 was 2b4a9f26, checked in by Martin Decky <martin@…>, 15 years ago |
Add interrupts-disabled spinlocks whose purpose is the semantic distinction between spinlocks acquired always with interrupts disabled and normal spinlocks.
The compile-time distinction is implemented by the means of the type system and basic code correctness properties can be checked by the debugging assertions during run-time (with CONFIG_DEBUG)
- Correct bracketing of top-level interrupts-disabled spinlocks
- Correctness of the use of nested interrupts-disabled spinlocks (interrupts must be actually disabled)
- Basic consistency of places where the interrupt level is restored
The API encapsulates the physical manipulation with the interrupt levels and also two common locking patterns
- Sequential unlocking of spinlock A before locking of spinlock B without restoring original interrupt level (irq_spinlock_pass())
- Hand-over-hand locking of two locks in the correct locking order, e.g. if A precedes B, then locking of B before unlocking A (irq_spinlock_exchange())
A new HAL function interrupts_disabled() should be implemented in each port to support the run-time checks of correctly disabled interrupts while locking nested interrupts-disabled spinlocks
(only in debug builds, not used in non-debug builds).
|
-
Property mode
set to
100644
|
File size:
2.1 KB
|
Rev | Line | |
---|
[f761f1eb] | 1 |
|
---|
| 2 | SPINNING LOCKS
|
---|
| 3 | spinlock_lock, spinlock_trylock, spinlock_unlock
|
---|
| 4 | +------------+
|
---|
| 5 | | spinlock_t |
|
---|
| 6 | +------------+
|
---|
[2b4a9f26] | 7 | |
|
---|
| 8 | +------------------------------+
|
---|
| 9 | |
|
---|
| 10 | INTERRUPTS-DISABLED SPINNING LOCKS |
|
---|
| 11 | irq_spinlock_lock, irq_spinlock_trylock, irq_spinlock_unlock |
|
---|
| 12 | +----------------+ |
|
---|
| 13 | | irq_spinlock_t |<--------------------+
|
---|
| 14 | +----------------+
|
---|
| 15 |
|
---|
| 16 |
|
---|
[f761f1eb] | 17 |
|
---|
| 18 | WAIT QUEUES
|
---|
| 19 | waitq_sleep_timeout, waitq_wakeup
|
---|
| 20 | +---------+
|
---|
| 21 | | waitq_t |
|
---|
[2b4a9f26] | 22 | +---------+
|
---|
| 23 | / \
|
---|
[f761f1eb] | 24 | SEMAPHORES / \ CONDITION VARIABLES
|
---|
| 25 | semaphore_down_timeout, semaphore_up condvar_wait_timeout, condvar_signal
|
---|
| 26 | +--------------+ / \ +-----------+
|
---|
| 27 | | semaphore_t |<-+ +->| condvar_t |
|
---|
| 28 | +--------------+ +-----------+
|
---|
| 29 | | ^
|
---|
[2b4a9f26] | 30 | | |
|
---|
[f761f1eb] | 31 | | +------+
|
---|
[2b4a9f26] | 32 | V /
|
---|
[f761f1eb] | 33 | MUTEXES / READERS/WRITERS LOCKS
|
---|
| 34 | mutex_lock_timeout, mutex_unlock rwlock_reader/writer_lock_timeout, rwlock_unlock
|
---|
| 35 | +---------+ / +----------+
|
---|
[2b4a9f26] | 36 | | mutex_t |------------------------------->| rwlock_t |
|
---|
| 37 | +---------+ / +----------+
|
---|
| 38 | | /
|
---|
| 39 | +------------------------+
|
---|
Note:
See
TracBrowser
for help on using the repository browser.