c-pal/linux/devdoc/srw_lock_linux_requirements.md

6.4 KiB

srw_lock_linux requirements

Overview

srw_lock_linux is an implementation of slim reader-writer lock for linux.

Design

srw_lock_linux can be used for synchronizing resources across threads. It has on exclusive mode for write lock and shared mode for read lock. Acquire APIs will apply the required type of lock to pthread_rwlock_t and get blocked if the operation can not be done. Try acquire APIs will fail if the equivalent acquire APIs get blocked.

Exposed API

typedef struct SRW_LOCK_HANDLE_DATA_TAG* SRW_LOCK_HANDLE;

#define SRW_LOCK_TRY_ACQUIRE_RESULT_VALUES \
    SRW_LOCK_TRY_ACQUIRE_OK, \
    SRW_LOCK_TRY_ACQUIRE_COULD_NOT_ACQUIRE, \
    SRW_LOCK_TRY_ACQUIRE_INVALID_ARGS

MU_DEFINE_ENUM(SRW_LOCK_TRY_ACQUIRE_RESULT, SRW_LOCK_TRY_ACQUIRE_RESULT_VALUES)

MOCKABLE_FUNCTION(, SRW_LOCK_HANDLE, srw_lock_create, bool, do_statistics, const char*, lock_name);

/*writer APIs*/
MOCKABLE_FUNCTION(, void, srw_lock_acquire_exclusive, SRW_LOCK_HANDLE, handle);
MOCKABLE_FUNCTION(, SRW_LOCK_TRY_ACQUIRE_RESULT, srw_lock_try_acquire_exclusive, SRW_LOCK_HANDLE, handle);
MOCKABLE_FUNCTION(, void, srw_lock_release_exclusive, SRW_LOCK_HANDLE, handle);

/*reader APIs*/
MOCKABLE_FUNCTION(, void, srw_lock_acquire_shared, SRW_LOCK_HANDLE, handle);
MOCKABLE_FUNCTION(, SRW_LOCK_TRY_ACQUIRE_RESULT, srw_lock_try_acquire_shared, SRW_LOCK_HANDLE, handle);
MOCKABLE_FUNCTION(, void, srw_lock_release_shared, SRW_LOCK_HANDLE, handle);

MOCKABLE_FUNCTION(, void, srw_lock_destroy, SRW_LOCK_HANDLE, handle);

srw_lock_create

MOCKABLE_FUNCTION(, SRW_LOCK_HANDLE, srw_lock_create, bool, do_statistics, const char*, lock_name);

srw_lock_create creates a new SRW_LOCK_HANDLE.

SRS_SRW_LOCK_LINUX_07_001: [ srw_lock_create shall allocate memory for SRW_LOCK_HANDLE_DATA. ]

SRS_SRW_LOCK_LINUX_07_002: [ srw_lock_create shall copy the lock_name. ]

SRS_SRW_LOCK_LINUX_07_003: [ srw_lock_create shall initialized the pthread_rwlock_t by calling pthread_rwlock_init. ]

SRS_SRW_LOCK_LINUX_07_006: [ If initializing the lock failed, srw_lock_create shall fail and return NULL. ]

SRS_SRW_LOCK_LINUX_07_004: [ srw_lock_create shall succeed and return a non-NULL value. ]

SRS_SRW_LOCK_LINUX_07_005: [ If there are any failures, srw_lock_create shall fail and return NULL. ]

srw_lock_acquire_exclusive

MOCKABLE_FUNCTION(, void, srw_lock_acquire_exclusive, SRW_LOCK_HANDLE, handle);

srw_lock_acquire_exclusive acquires the lock in exclusive (writer) mode.

SRS_SRW_LOCK_LINUX_07_007: [ If handle is NULL, srw_lock_acquire_exclusive shall return. ]

SRS_SRW_LOCK_LINUX_07_008: [ srw_lock_acquire_exclusive shall lock the pthread_rwlock_t for writing by calling pthread_rwlock_wrlock. ]

srw_lock_try_acquire_exclusive

MOCKABLE_FUNCTION(, SRW_LOCK_TRY_ACQUIRE_RESULT, srw_lock_try_acquire_exclusive, SRW_LOCK_HANDLE, handle);

srw_lock_try_acquire_exclusive attempts to acquire the lock in exclusive (writer) mode.

SRS_SRW_LOCK_LINUX_07_009: [ If handle is NULL, srw_lock_try_acquire_exclusive shall fail and return SRW_LOCK_TRY_ACQUIRE_INVALID_ARGS. ]

SRS_SRW_LOCK_LINUX_07_010: [ Otherwise srw_lock_acquire_exclusive shall apply a write lock on pthread_rwlock_t only if no other threads are currently holding the pthread_rwlock_t by calling pthread_rwlock_trywrlock. ]

SRS_SRW_LOCK_LINUX_07_011: [ If pthread_rwlock_trywrlock returns 0, srw_lock_acquire_exclusive shall return SRW_LOCK_TRY_ACQUIRE_OK. ]

SRS_SRW_LOCK_LINUX_07_012: [ Otherwise, srw_lock_acquire_exclusive shall return SRW_LOCK_TRY_ACQUIRE_COULD_NOT_ACQUIRE. ]

srw_lock_release_exclusive

MOCKABLE_FUNCTION(, void, srw_lock_release_exclusive, SRW_LOCK_HANDLE, handle);

srw_lock_release_exclusive releases the underlying pthread_rwlock_t from exclusive (write) mode.

SRS_SRW_LOCK_LINUX_07_013: [ If handle is NULL, srw_lock_release_exclusive shall return. ]

SRS_SRW_LOCK_LINUX_07_014: [ srw_lock_release_exclusive shall release the write lock by calling pthread_rwlock_unlock. ]

srw_lock_acquire_shared

MOCKABLE_FUNCTION(, void, srw_lock_acquire_shared, SRW_LOCK_HANDLE, handle);

srw_lock_acquire_shared acquires the pthread_rwlock_t in shared (read) mode.

SRS_SRW_LOCK_LINUX_07_015: [ If handle is NULL, srw_lock_acquire_shared shall return. ]

SRS_SRW_LOCK_LINUX_07_016: [ srw_lock_acquire_shared shall apply a read lock to pthread_rwlock_t by calling pthread_rwlock_rdlock. ]

srw_lock_try_acquire_shared

MOCKABLE_FUNCTION(, SRW_LOCK_TRY_ACQUIRE_RESULT, srw_lock_try_acquire_shared, SRW_LOCK_HANDLE, handle);

srw_lock_try_acquire_shared attempts to acquire the pthread_rwlock_t in shared (read) mode.

SRS_SRW_LOCK_LINUX_07_017: [ If handle is NULL then srw_lock_try_acquire_shared shall fail and return SRW_LOCK_TRY_ACQUIRE_INVALID_ARGS. ]

SRS_SRW_LOCK_LINUX_07_018: [ Otherwise srw_lock_try_acquire_shared shall apply a read lock on pthread_rwlock_t if there's no writers hold the lock and no writers blocked on the lock by calling pthread_rwlock_tryrdlock. ]

SRS_SRW_LOCK_LINUX_07_019: [ If pthread_rwlock_tryrdlock returns 0, srw_lock_try_acquire_shared shall return SRW_LOCK_TRY_ACQUIRE_OK. ]

SRS_SRW_LOCK_LINUX_07_020: [ Otherwise, srw_lock_try_acquire_shared shall return SRW_LOCK_TRY_ACQUIRE_COULD_NOT_ACQUIRE. ]

srw_lock_release_shared

MOCKABLE_FUNCTION(, void, srw_lock_release_shared, SRW_LOCK_HANDLE, handle);

srw_lock_release_exclusive releases the underlying pthread_rwlock_t from shared (read) mode.

SRS_SRW_LOCK_LINUX_07_021: [ If handle is NULL, srw_lock_release_shared shall return. ]

SRS_SRW_LOCK_LINUX_07_022: [ srw_lock_release_shared shall release the read lock by calling pthread_rwlock_unlock. ]

srw_lock_destroy

MOCKABLE_FUNCTION(, void, srw_lock_destroy, SRW_LOCK_HANDLE, handle);

srw_lock_destroy frees all used resources.

SRS_SRW_LOCK_LINUX_07_023: [ If handle is NULL then srw_lock_destroy shall return. ]

SRS_SRW_LOCK_LINUX_07_024: [ srw_lock_destroy shall free the stored lock name. ]

SRS_SRW_LOCK_LINUX_07_025: [ srw_lock_destroy shall destroy the pthread_rwlock_t by calling pthread_rwlock_destroy. ]

SRS_SRW_LOCK_LINUX_07_026: [ srw_lock_destroy shall free the lock handle. ]