diff --git a/test/test-list.h b/test/test-list.h index 31899664..8ee74391 100644 --- a/test/test-list.h +++ b/test/test-list.h @@ -291,6 +291,7 @@ TEST_DECLARE (threadpool_cancel_single) TEST_DECLARE (thread_local_storage) TEST_DECLARE (thread_mutex) TEST_DECLARE (thread_rwlock) +TEST_DECLARE (thread_rwlock_trylock) TEST_DECLARE (thread_create) TEST_DECLARE (thread_equal) TEST_DECLARE (dlerror) @@ -707,6 +708,7 @@ TASK_LIST_START TEST_ENTRY (thread_local_storage) TEST_ENTRY (thread_mutex) TEST_ENTRY (thread_rwlock) + TEST_ENTRY (thread_rwlock_trylock) TEST_ENTRY (thread_create) TEST_ENTRY (thread_equal) TEST_ENTRY (dlerror) diff --git a/test/test-mutexes.c b/test/test-mutexes.c index 896f46bb..4aeac73b 100644 --- a/test/test-mutexes.c +++ b/test/test-mutexes.c @@ -61,3 +61,62 @@ TEST_IMPL(thread_rwlock) { return 0; } + + +TEST_IMPL(thread_rwlock_trylock) { + uv_rwlock_t rwlock; + int r; + + r = uv_rwlock_init(&rwlock); + ASSERT(r == 0); + + /* No locks held. */ + + r = uv_rwlock_trywrlock(&rwlock); + ASSERT(r == 0); + + /* Write lock held. */ + + r = uv_rwlock_tryrdlock(&rwlock); + ASSERT(r == UV_EBUSY); + r = uv_rwlock_trywrlock(&rwlock); + ASSERT(r == UV_EBUSY); + + uv_rwlock_wrunlock(&rwlock); + + /* No locks held. */ + + r = uv_rwlock_tryrdlock(&rwlock); + ASSERT(r == 0); + + /* One read lock held. */ + + r = uv_rwlock_tryrdlock(&rwlock); + ASSERT(r == 0); + + /* Two read locks held. */ + + r = uv_rwlock_trywrlock(&rwlock); + ASSERT(r == UV_EBUSY); + + uv_rwlock_rdunlock(&rwlock); + + /* One read lock held. */ + + uv_rwlock_rdunlock(&rwlock); + + /* No read locks held. */ + + r = uv_rwlock_trywrlock(&rwlock); + ASSERT(r == 0); + + /* Write lock held. */ + + uv_rwlock_wrunlock(&rwlock); + + /* No locks held. */ + + uv_rwlock_destroy(&rwlock); + + return 0; +}