]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
blah
authorAnthony Minessale <anthm@freeswitch.org>
Mon, 27 Mar 2017 22:23:41 +0000 (17:23 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Mon, 27 Mar 2017 22:23:41 +0000 (17:23 -0500)
libs/libks/src/ks_mutex.c

index d21271d476a5839fd7b1026b3222392a2775c045..b21f6963433ff264ce374174c87d53ff3c47739a 100644 (file)
@@ -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