From e3dd169d63dcded0fc787e10ec1cf6520fb5028b Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Mon, 27 Mar 2017 17:23:41 -0500 Subject: [PATCH] blah --- libs/libks/src/ks_mutex.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/libs/libks/src/ks_mutex.c b/libs/libks/src/ks_mutex.c index d21271d476..b21f696343 100644 --- a/libs/libks/src/ks_mutex.c +++ b/libs/libks/src/ks_mutex.c @@ -431,6 +431,7 @@ struct ks_rwl { SRWLOCK rwlock; ks_hash_t *read_lock_list; ks_mutex_t *read_lock_mutex; + ks_mutex_t *write_lock_mutex; #else pthread_rwlock_t rwlock; #endif @@ -484,6 +485,10 @@ KS_DECLARE(ks_status_t) ks_rwl_create(ks_rwl_t **rwlock, ks_pool_t *pool) goto done; } + if (ks_mutex_create(&check->write_lock_mutex, KS_MUTEX_FLAG_DEFAULT, pool) != KS_STATUS_SUCCESS) { + goto done; + } + InitializeSRWLock(&check->rwlock); #else if ((pthread_rwlock_init(&check->rwlock, NULL))) { @@ -502,6 +507,7 @@ KS_DECLARE(ks_status_t) ks_rwl_read_lock(ks_rwl_t *rwlock) { #ifdef WIN32 + ks_mutex_lock(rwlock->write_lock_mutex); ks_mutex_lock(rwlock->read_lock_mutex); int count = (int)(intptr_t)ks_hash_remove(rwlock->read_lock_list, (void *)(intptr_t)ks_thread_self_id()); @@ -509,6 +515,7 @@ KS_DECLARE(ks_status_t) ks_rwl_read_lock(ks_rwl_t *rwlock) if (count) { ks_hash_insert(rwlock->read_lock_list, (void *)(intptr_t)ks_thread_self_id(), (void *)(intptr_t)++count); ks_mutex_unlock(rwlock->read_lock_mutex); + ks_mutex_unlock(rwlock->write_lock_mutex); return KS_STATUS_SUCCESS; } @@ -520,6 +527,7 @@ KS_DECLARE(ks_status_t) ks_rwl_read_lock(ks_rwl_t *rwlock) #ifdef WIN32 ks_hash_insert(rwlock->read_lock_list, (void *)(intptr_t)ks_thread_self_id(), (void *)(intptr_t)(int)1); ks_mutex_unlock(rwlock->read_lock_mutex); + ks_mutex_unlock(rwlock->write_lock_mutex); #endif return KS_STATUS_SUCCESS; @@ -536,6 +544,7 @@ KS_DECLARE(ks_status_t) ks_rwl_write_lock(ks_rwl_t *rwlock) } #ifdef WIN32 + ks_mutex_lock(rwlock->write_lock_mutex); AcquireSRWLockExclusive(&rwlock->rwlock); #else pthread_rwlock_wrlock(&rwlock->rwlock); @@ -548,6 +557,10 @@ KS_DECLARE(ks_status_t) ks_rwl_write_lock(ks_rwl_t *rwlock) KS_DECLARE(ks_status_t) ks_rwl_try_read_lock(ks_rwl_t *rwlock) { #ifdef WIN32 + if (ks_mutex_trylock(rwlock->write_lock_mutex) != KS_STATUS_SUCCESS) { + return KS_STATUS_FALSE; + } + ks_mutex_lock(rwlock->read_lock_mutex); int count = (int)(intptr_t)ks_hash_remove(rwlock->read_lock_list, (void *)(intptr_t)ks_thread_self_id()); @@ -555,11 +568,13 @@ KS_DECLARE(ks_status_t) ks_rwl_try_read_lock(ks_rwl_t *rwlock) if (count) { ks_hash_insert(rwlock->read_lock_list, (void *)(intptr_t)ks_thread_self_id(), (void *)(intptr_t)++count); ks_mutex_unlock(rwlock->read_lock_mutex); + ks_mutex_unlock(rwlock->write_lock_mutex); return KS_STATUS_SUCCESS; } if (!TryAcquireSRWLockShared(&rwlock->rwlock)) { ks_mutex_unlock(rwlock->read_lock_mutex); + ks_mutex_unlock(rwlock->write_lock_mutex); return KS_STATUS_FAIL; } #else @@ -571,6 +586,7 @@ KS_DECLARE(ks_status_t) ks_rwl_try_read_lock(ks_rwl_t *rwlock) #ifdef WIN32 ks_hash_insert(rwlock->read_lock_list, (void *)(intptr_t)ks_thread_self_id(), (void *)(intptr_t)(int)1); ks_mutex_unlock(rwlock->read_lock_mutex); + ks_mutex_unlock(rwlock->write_lock_mutex); #endif return KS_STATUS_SUCCESS; @@ -635,6 +651,7 @@ KS_DECLARE(ks_status_t) ks_rwl_write_unlock(ks_rwl_t *rwlock) #ifdef WIN32 ReleaseSRWLockExclusive(&rwlock->rwlock); + ks_mutex_unlock(rwlock->write_lock_mutex); #else pthread_rwlock_unlock(&rwlock->rwlock); #endif