|
|
@ -76,19 +76,13 @@ void _mutex_lock(pthread_mutex_t *lock, const char *file, const char *func, cons |
|
|
|
GOTLOCK(lock, file, func, line); |
|
|
|
GOTLOCK(lock, file, func, line); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void _mutex_unlock_noyield(pthread_mutex_t *lock, const char *file, const char *func, const int line) |
|
|
|
void _mutex_unlock(pthread_mutex_t *lock, const char *file, const char *func, const int line) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (unlikely(pthread_mutex_unlock(lock))) |
|
|
|
if (unlikely(pthread_mutex_unlock(lock))) |
|
|
|
quitfrom(1, file, func, line, "WTF MUTEX ERROR ON UNLOCK!"); |
|
|
|
quitfrom(1, file, func, line, "WTF MUTEX ERROR ON UNLOCK!"); |
|
|
|
GUNLOCK(lock, file, func, line); |
|
|
|
GUNLOCK(lock, file, func, line); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void _mutex_unlock(pthread_mutex_t *lock, const char *file, const char *func, const int line) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
_mutex_unlock_noyield(lock, file, func, line); |
|
|
|
|
|
|
|
sched_yield(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int _mutex_trylock(pthread_mutex_t *lock, __maybe_unused const char *file, __maybe_unused const char *func, __maybe_unused const int line) |
|
|
|
int _mutex_trylock(pthread_mutex_t *lock, __maybe_unused const char *file, __maybe_unused const char *func, __maybe_unused const int line) |
|
|
|
{ |
|
|
|
{ |
|
|
|
TRYLOCK(lock, file, func, line); |
|
|
|
TRYLOCK(lock, file, func, line); |
|
|
@ -128,26 +122,14 @@ void _rw_unlock(pthread_rwlock_t *lock, const char *file, const char *func, cons |
|
|
|
GUNLOCK(lock, file, func, line); |
|
|
|
GUNLOCK(lock, file, func, line); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void _rd_unlock_noyield(pthread_rwlock_t *lock, const char *file, const char *func, const int line) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
_rw_unlock(lock, file, func, line); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void _wr_unlock_noyield(pthread_rwlock_t *lock, const char *file, const char *func, const int line) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
_rw_unlock(lock, file, func, line); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void _rd_unlock(pthread_rwlock_t *lock, const char *file, const char *func, const int line) |
|
|
|
void _rd_unlock(pthread_rwlock_t *lock, const char *file, const char *func, const int line) |
|
|
|
{ |
|
|
|
{ |
|
|
|
_rw_unlock(lock, file, func, line); |
|
|
|
_rw_unlock(lock, file, func, line); |
|
|
|
sched_yield(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void _wr_unlock(pthread_rwlock_t *lock, const char *file, const char *func, const int line) |
|
|
|
void _wr_unlock(pthread_rwlock_t *lock, const char *file, const char *func, const int line) |
|
|
|
{ |
|
|
|
{ |
|
|
|
_rw_unlock(lock, file, func, line); |
|
|
|
_rw_unlock(lock, file, func, line); |
|
|
|
sched_yield(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void _mutex_init(pthread_mutex_t *lock, const char *file, const char *func, const int line) |
|
|
|
void _mutex_init(pthread_mutex_t *lock, const char *file, const char *func, const int line) |
|
|
@ -199,7 +181,7 @@ void _ck_rlock(cklock_t *lock, const char *file, const char *func, const int lin |
|
|
|
{ |
|
|
|
{ |
|
|
|
_mutex_lock(&lock->mutex, file, func, line); |
|
|
|
_mutex_lock(&lock->mutex, file, func, line); |
|
|
|
_rd_lock(&lock->rwlock, file, func, line); |
|
|
|
_rd_lock(&lock->rwlock, file, func, line); |
|
|
|
_mutex_unlock_noyield(&lock->mutex, file, func, line); |
|
|
|
_mutex_unlock(&lock->mutex, file, func, line); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Intermediate variant of cklock - behaves as a read lock but can be promoted
|
|
|
|
/* Intermediate variant of cklock - behaves as a read lock but can be promoted
|
|
|
@ -231,9 +213,9 @@ void _ck_wlock(cklock_t *lock, const char *file, const char *func, const int lin |
|
|
|
/* Downgrade write variant to a read lock */ |
|
|
|
/* Downgrade write variant to a read lock */ |
|
|
|
void _ck_dwlock(cklock_t *lock, const char *file, const char *func, const int line) |
|
|
|
void _ck_dwlock(cklock_t *lock, const char *file, const char *func, const int line) |
|
|
|
{ |
|
|
|
{ |
|
|
|
_wr_unlock_noyield(&lock->rwlock, file, func, line); |
|
|
|
_wr_unlock(&lock->rwlock, file, func, line); |
|
|
|
_rd_lock(&lock->rwlock, file, func, line); |
|
|
|
_rd_lock(&lock->rwlock, file, func, line); |
|
|
|
_mutex_unlock_noyield(&lock->mutex, file, func, line); |
|
|
|
_mutex_unlock(&lock->mutex, file, func, line); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Demote a write variant to an intermediate variant */ |
|
|
|
/* Demote a write variant to an intermediate variant */ |
|
|
@ -246,7 +228,7 @@ void _ck_dwilock(cklock_t *lock, const char *file, const char *func, const int l |
|
|
|
void _ck_dlock(cklock_t *lock, const char *file, const char *func, const int line) |
|
|
|
void _ck_dlock(cklock_t *lock, const char *file, const char *func, const int line) |
|
|
|
{ |
|
|
|
{ |
|
|
|
_rd_lock(&lock->rwlock, file, func, line); |
|
|
|
_rd_lock(&lock->rwlock, file, func, line); |
|
|
|
_mutex_unlock_noyield(&lock->mutex, file, func, line); |
|
|
|
_mutex_unlock(&lock->mutex, file, func, line); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void _ck_runlock(cklock_t *lock, const char *file, const char *func, const int line) |
|
|
|
void _ck_runlock(cklock_t *lock, const char *file, const char *func, const int line) |
|
|
@ -256,7 +238,7 @@ void _ck_runlock(cklock_t *lock, const char *file, const char *func, const int l |
|
|
|
|
|
|
|
|
|
|
|
void _ck_wunlock(cklock_t *lock, const char *file, const char *func, const int line) |
|
|
|
void _ck_wunlock(cklock_t *lock, const char *file, const char *func, const int line) |
|
|
|
{ |
|
|
|
{ |
|
|
|
_wr_unlock_noyield(&lock->rwlock, file, func, line); |
|
|
|
_wr_unlock(&lock->rwlock, file, func, line); |
|
|
|
_mutex_unlock(&lock->mutex, file, func, line); |
|
|
|
_mutex_unlock(&lock->mutex, file, func, line); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|