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
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))) {
{
#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());
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;
}
#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;
}
#ifdef WIN32
+ ks_mutex_lock(rwlock->write_lock_mutex);
AcquireSRWLockExclusive(&rwlock->rwlock);
#else
pthread_rwlock_wrlock(&rwlock->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());
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
#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;
#ifdef WIN32
ReleaseSRWLockExclusive(&rwlock->rwlock);
+ ks_mutex_unlock(rwlock->write_lock_mutex);
#else
pthread_rwlock_unlock(&rwlock->rwlock);
#endif