API Reference Manual  1.45.0
ODP LOCKS

API Description

Various types of locks for thread synchronization.

Reader / writer lock (odp_rwlock_t)

A reader/writer lock allows multiple simultaneous readers but only one writer at a time. A thread that wants write access will have to wait until there are no threads that want read access. This causes a risk for starvation. The trylock variants can be used to avoid blocking when the lock is not immediately available.

Recursive reader/writer lock (odp_rwlock_recursive_t)

This is recursive version of the reader/writer lock. A thread can read- or write-acquire a recursive read-write lock multiple times without a deadlock. To release the lock, the thread must unlock it the same number of times. Recursion is supported only for a pure series of read or write lock calls. Read and write lock calls must not be mixed when recursing.

For example, these are supported...

... but this is not supported.

The trylock variants can be used to avoid blocking when the lock is not immediately available.

Spin lock (odp_spinlock_t)

Spinlock simply re-tries to acquire the lock as long as takes to succeed. Spinlock is not fair since some threads may succeed more often than others.

Recursive spin lock (odp_spinlock_recursive_t)

This is recursive version of the spin lock. A thread can acquire the lock multiple times without a deadlock. To release the lock, the thread must unlock it the same number of times.

Ticket lock (odp_ticketlock_t)

Acquiring a ticket lock happens in two phases. First the threads takes a ticket. Second it waits (spins) until it is its turn. Ticket locks are believed to be more fair than spin locks. Ticket locks shall not be used if a thread may be preempted, since other threads cannot acquire the lock while the thread in turn is stalled.

Typedefs

typedef struct odp_rwlock_s odp_rwlock_t
 ODP reader/writer lock. More...
 
typedef struct odp_rwlock_recursive_s odp_rwlock_recursive_t
 Recursive rwlock. More...
 
typedef struct odp_spinlock_s odp_spinlock_t
 ODP spinlock. More...
 
typedef struct odp_spinlock_recursive_s odp_spinlock_recursive_t
 Recursive spinlock. More...
 
typedef struct odp_ticketlock_s odp_ticketlock_t
 ODP ticketlock. More...
 

Functions

void odp_rwlock_init (odp_rwlock_t *rwlock)
 Initialize a reader/writer lock. More...
 
void odp_rwlock_read_lock (odp_rwlock_t *rwlock)
 Acquire read permission on a reader/writer lock. More...
 
int odp_rwlock_read_trylock (odp_rwlock_t *rwlock)
 Try to acquire read permission to a reader/writer lock. More...
 
void odp_rwlock_read_unlock (odp_rwlock_t *rwlock)
 Release read permission on a reader/writer lock. More...
 
void odp_rwlock_write_lock (odp_rwlock_t *rwlock)
 Acquire write permission on a reader/writer lock. More...
 
int odp_rwlock_write_trylock (odp_rwlock_t *rwlock)
 Try to acquire write permission to a reader/writer lock. More...
 
void odp_rwlock_write_unlock (odp_rwlock_t *rwlock)
 Release write permission on a reader/writer lock. More...
 
void odp_rwlock_recursive_init (odp_rwlock_recursive_t *lock)
 Initialize recursive rwlock. More...
 
void odp_rwlock_recursive_read_lock (odp_rwlock_recursive_t *lock)
 Acquire recursive rwlock for reading. More...
 
int odp_rwlock_recursive_read_trylock (odp_rwlock_recursive_t *lock)
 Try to acquire recursive rwlock for reading. More...
 
void odp_rwlock_recursive_read_unlock (odp_rwlock_recursive_t *lock)
 Release recursive rwlock after reading. More...
 
void odp_rwlock_recursive_write_lock (odp_rwlock_recursive_t *lock)
 Acquire recursive rwlock for writing. More...
 
int odp_rwlock_recursive_write_trylock (odp_rwlock_recursive_t *lock)
 Try to acquire recursive rwlock for writing. More...
 
void odp_rwlock_recursive_write_unlock (odp_rwlock_recursive_t *lock)
 Release recursive rwlock after writing. More...
 
void odp_spinlock_init (odp_spinlock_t *splock)
 Initialize spin lock. More...
 
void odp_spinlock_lock (odp_spinlock_t *splock)
 Acquire spin lock. More...
 
int odp_spinlock_trylock (odp_spinlock_t *splock)
 Try to acquire spin lock. More...
 
void odp_spinlock_unlock (odp_spinlock_t *splock)
 Release spin lock. More...
 
int odp_spinlock_is_locked (odp_spinlock_t *splock)
 Check if spin lock is busy (locked). More...
 
void odp_spinlock_recursive_init (odp_spinlock_recursive_t *lock)
 Initialize recursive spinlock. More...
 
void odp_spinlock_recursive_lock (odp_spinlock_recursive_t *lock)
 Acquire recursive spinlock. More...
 
int odp_spinlock_recursive_trylock (odp_spinlock_recursive_t *lock)
 Try to acquire recursive spinlock. More...
 
void odp_spinlock_recursive_unlock (odp_spinlock_recursive_t *lock)
 Release recursive spinlock. More...
 
int odp_spinlock_recursive_is_locked (odp_spinlock_recursive_t *lock)
 Check if recursive spinlock is locked. More...
 
void odp_ticketlock_init (odp_ticketlock_t *tklock)
 Initialize ticket lock. More...
 
void odp_ticketlock_lock (odp_ticketlock_t *tklock)
 Acquire ticket lock. More...
 
int odp_ticketlock_trylock (odp_ticketlock_t *tklock)
 Try to acquire ticket lock. More...
 
void odp_ticketlock_unlock (odp_ticketlock_t *tklock)
 Release ticket lock. More...
 
int odp_ticketlock_is_locked (odp_ticketlock_t *tklock)
 Check if ticket lock is locked. More...
 

Typedef Documentation

◆ odp_rwlock_t

ODP reader/writer lock.

◆ odp_rwlock_recursive_t

Recursive rwlock.

◆ odp_spinlock_t

ODP spinlock.

◆ odp_spinlock_recursive_t

Recursive spinlock.

◆ odp_ticketlock_t

ODP ticketlock.

Function Documentation

◆ odp_rwlock_init()

void odp_rwlock_init ( odp_rwlock_t rwlock)

Initialize a reader/writer lock.

Parameters
rwlockPointer to a reader/writer lock
Examples
odp_lock_perf.c.

◆ odp_rwlock_read_lock()

void odp_rwlock_read_lock ( odp_rwlock_t rwlock)

Acquire read permission on a reader/writer lock.

Parameters
rwlockPointer to a reader/writer lock
Examples
odp_lock_perf.c.

◆ odp_rwlock_read_trylock()

int odp_rwlock_read_trylock ( odp_rwlock_t rwlock)

Try to acquire read permission to a reader/writer lock.

Parameters
rwlockPointer to a reader/writer lock
Return values
0Lock was not available for read access
!0Read access to lock acquired

◆ odp_rwlock_read_unlock()

void odp_rwlock_read_unlock ( odp_rwlock_t rwlock)

Release read permission on a reader/writer lock.

Parameters
rwlockPointer to a reader/writer lock
Examples
odp_lock_perf.c.

◆ odp_rwlock_write_lock()

void odp_rwlock_write_lock ( odp_rwlock_t rwlock)

Acquire write permission on a reader/writer lock.

Parameters
rwlockPointer to a reader/writer lock
Examples
odp_lock_perf.c.

◆ odp_rwlock_write_trylock()

int odp_rwlock_write_trylock ( odp_rwlock_t rwlock)

Try to acquire write permission to a reader/writer lock.

Parameters
rwlockPointer to a reader/writer lock
Return values
0Lock was not available for write access
!0Write access to lock acquired

◆ odp_rwlock_write_unlock()

void odp_rwlock_write_unlock ( odp_rwlock_t rwlock)

Release write permission on a reader/writer lock.

Parameters
rwlockPointer to a reader/writer lock
Examples
odp_lock_perf.c.

◆ odp_rwlock_recursive_init()

void odp_rwlock_recursive_init ( odp_rwlock_recursive_t lock)

Initialize recursive rwlock.

Parameters
lockPointer to a lock
Examples
odp_lock_perf.c.

◆ odp_rwlock_recursive_read_lock()

void odp_rwlock_recursive_read_lock ( odp_rwlock_recursive_t lock)

Acquire recursive rwlock for reading.

This call allows the thread to acquire the same lock multiple times for reading. The lock cannot be acquired for writing while holding it for reading.

Parameters
lockPointer to a lock
Examples
odp_lock_perf.c.

◆ odp_rwlock_recursive_read_trylock()

int odp_rwlock_recursive_read_trylock ( odp_rwlock_recursive_t lock)

Try to acquire recursive rwlock for reading.

Parameters
lockPointer to a lock
Return values
0Lock was not available for read access
!0Read access to lock acquired

◆ odp_rwlock_recursive_read_unlock()

void odp_rwlock_recursive_read_unlock ( odp_rwlock_recursive_t lock)

Release recursive rwlock after reading.

Parameters
lockPointer to a lock
Examples
odp_lock_perf.c.

◆ odp_rwlock_recursive_write_lock()

void odp_rwlock_recursive_write_lock ( odp_rwlock_recursive_t lock)

Acquire recursive rwlock for writing.

This call allows the thread to acquire the same lock multiple times for writing. The lock cannot be acquired for reading while holding it for writing.

Parameters
lockPointer to a lock
Examples
odp_lock_perf.c.

◆ odp_rwlock_recursive_write_trylock()

int odp_rwlock_recursive_write_trylock ( odp_rwlock_recursive_t lock)

Try to acquire recursive rwlock for writing.

Parameters
lockPointer to a lock
Return values
0Lock was not available for write access
!0Write access to lock acquired

◆ odp_rwlock_recursive_write_unlock()

void odp_rwlock_recursive_write_unlock ( odp_rwlock_recursive_t lock)

Release recursive rwlock after writing.

Parameters
lockPointer to a lock
Examples
odp_lock_perf.c.

◆ odp_spinlock_init()

void odp_spinlock_init ( odp_spinlock_t splock)

Initialize spin lock.

Parameters
splockPointer to a spin lock
Examples
odp_lock_perf.c.

◆ odp_spinlock_lock()

void odp_spinlock_lock ( odp_spinlock_t splock)

Acquire spin lock.

Parameters
splockPointer to a spin lock
Examples
odp_lock_perf.c.

◆ odp_spinlock_trylock()

int odp_spinlock_trylock ( odp_spinlock_t splock)

Try to acquire spin lock.

Parameters
splockPointer to a spin lock
Return values
0lock not acquired
!0lock acquired

◆ odp_spinlock_unlock()

void odp_spinlock_unlock ( odp_spinlock_t splock)

Release spin lock.

Parameters
splockPointer to a spin lock
Examples
odp_lock_perf.c.

◆ odp_spinlock_is_locked()

int odp_spinlock_is_locked ( odp_spinlock_t splock)

Check if spin lock is busy (locked).

Parameters
splockPointer to a spin lock
Return values
1lock busy (locked)
0lock not busy.

◆ odp_spinlock_recursive_init()

void odp_spinlock_recursive_init ( odp_spinlock_recursive_t lock)

Initialize recursive spinlock.

Parameters
lockPointer to a lock
Examples
odp_lock_perf.c.

◆ odp_spinlock_recursive_lock()

void odp_spinlock_recursive_lock ( odp_spinlock_recursive_t lock)

Acquire recursive spinlock.

Parameters
lockPointer to a lock
Examples
odp_lock_perf.c.

◆ odp_spinlock_recursive_trylock()

int odp_spinlock_recursive_trylock ( odp_spinlock_recursive_t lock)

Try to acquire recursive spinlock.

Parameters
lockPointer to a lock
Return values
1lock acquired
0lock not acquired

◆ odp_spinlock_recursive_unlock()

void odp_spinlock_recursive_unlock ( odp_spinlock_recursive_t lock)

Release recursive spinlock.

Parameters
lockPointer to a lock
Examples
odp_lock_perf.c.

◆ odp_spinlock_recursive_is_locked()

int odp_spinlock_recursive_is_locked ( odp_spinlock_recursive_t lock)

Check if recursive spinlock is locked.

Parameters
lockPointer to a lock
Return values
1lock is locked
0lock is not locked

◆ odp_ticketlock_init()

void odp_ticketlock_init ( odp_ticketlock_t tklock)

Initialize ticket lock.

Parameters
tklockPointer to a ticket lock
Examples
odp_dma_perf.c, and odp_lock_perf.c.

◆ odp_ticketlock_lock()

void odp_ticketlock_lock ( odp_ticketlock_t tklock)

Acquire ticket lock.

Parameters
tklockPointer to a ticket lock
Examples
odp_lock_perf.c.

◆ odp_ticketlock_trylock()

int odp_ticketlock_trylock ( odp_ticketlock_t tklock)

Try to acquire ticket lock.

Parameters
tklockPointer to a ticket lock
Return values
1lock acquired
0lock not acquired
Examples
odp_dma_perf.c.

◆ odp_ticketlock_unlock()

void odp_ticketlock_unlock ( odp_ticketlock_t tklock)

Release ticket lock.

Parameters
tklockPointer to a ticket lock
Examples
odp_dma_perf.c, and odp_lock_perf.c.

◆ odp_ticketlock_is_locked()

int odp_ticketlock_is_locked ( odp_ticketlock_t tklock)

Check if ticket lock is locked.

Parameters
tklockPointer to a ticket lock
Return values
1the lock is busy (locked)
0the lock is available (unlocked)