Changeset View
Changeset View
Standalone View
Standalone View
sys/sys/rwlock.h
Show First 20 Lines • Show All 93 Lines • ▼ Show 20 Lines | |||||
/* Acquire a write lock. */ | /* Acquire a write lock. */ | ||||
#define __rw_wlock(rw, tid, file, line) do { \ | #define __rw_wlock(rw, tid, file, line) do { \ | ||||
uintptr_t _tid = (uintptr_t)(tid); \ | uintptr_t _tid = (uintptr_t)(tid); \ | ||||
\ | \ | ||||
if (!_rw_write_lock((rw), _tid)) \ | if (!_rw_write_lock((rw), _tid)) \ | ||||
_rw_wlock_hard((rw), _tid, (file), (line)); \ | _rw_wlock_hard((rw), _tid, (file), (line)); \ | ||||
else \ | else \ | ||||
LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(LS_RW_WLOCK_ACQUIRE, \ | LOCKSTAT_PROFILE_OBTAIN_LOCK_SUCCESS(rw__acquire, \ | ||||
rw, 0, 0, (file), (line)); \ | rw, 0, 0, (file), (line), LOCKSTAT_WRITER); \ | ||||
} while (0) | } while (0) | ||||
/* Release a write lock. */ | /* Release a write lock. */ | ||||
#define __rw_wunlock(rw, tid, file, line) do { \ | #define __rw_wunlock(rw, tid, file, line) do { \ | ||||
uintptr_t _tid = (uintptr_t)(tid); \ | uintptr_t _tid = (uintptr_t)(tid); \ | ||||
\ | \ | ||||
if ((rw)->rw_recurse) \ | if ((rw)->rw_recurse) \ | ||||
(rw)->rw_recurse--; \ | (rw)->rw_recurse--; \ | ||||
else { \ | else { \ | ||||
LOCKSTAT_PROFILE_RELEASE_LOCK(LS_RW_WUNLOCK_RELEASE, \ | LOCKSTAT_PROFILE_RELEASE_LOCK(rw__release, rw, \ | ||||
(rw)); \ | LOCKSTAT_WRITER); \ | ||||
if (!_rw_write_unlock((rw), _tid)) \ | if (!_rw_write_unlock((rw), _tid)) \ | ||||
_rw_wunlock_hard((rw), _tid, (file), (line)); \ | _rw_wunlock_hard((rw), _tid, (file), (line)); \ | ||||
} \ | } \ | ||||
} while (0) | } while (0) | ||||
/* | /* | ||||
* Function prototypes. Routines that start with _ are not part of the | * Function prototypes. Routines that start with _ are not part of the | ||||
* external API and should not be called directly. Wrapper macros should | * external API and should not be called directly. Wrapper macros should | ||||
▲ Show 20 Lines • Show All 164 Lines • Show Last 20 Lines |