diff options
author | Calin Juravle <calin@google.com> | 2014-05-19 13:41:10 +0100 |
---|---|---|
committer | Calin Juravle <calin@google.com> | 2014-05-22 11:11:15 +0100 |
commit | 76f352eec12d8938101e5ae33429c72797c3aa23 (patch) | |
tree | 56eed6c22d5365278b4184921e70bbae4d0e7523 /tests/pthread_test.cpp | |
parent | 9b95ea936a72532c3124963312d348c6ee453d78 (diff) | |
download | android_bionic-76f352eec12d8938101e5ae33429c72797c3aa23.tar.gz android_bionic-76f352eec12d8938101e5ae33429c72797c3aa23.tar.bz2 android_bionic-76f352eec12d8938101e5ae33429c72797c3aa23.zip |
Mutex-free implementation of pthread_rwlock
Bug: 8133149
Change-Id: Id6775010d95f2634b173daa55d87a59a3cf4131b
Diffstat (limited to 'tests/pthread_test.cpp')
-rw-r--r-- | tests/pthread_test.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/pthread_test.cpp b/tests/pthread_test.cpp index fa66d21d9..801540431 100644 --- a/tests/pthread_test.cpp +++ b/tests/pthread_test.cpp @@ -551,11 +551,48 @@ TEST(pthread, pthread_rwlock_smoke) { pthread_rwlock_t l; ASSERT_EQ(0, pthread_rwlock_init(&l, NULL)); + // Single read lock ASSERT_EQ(0, pthread_rwlock_rdlock(&l)); ASSERT_EQ(0, pthread_rwlock_unlock(&l)); + // Multiple read lock + ASSERT_EQ(0, pthread_rwlock_rdlock(&l)); + ASSERT_EQ(0, pthread_rwlock_rdlock(&l)); + ASSERT_EQ(0, pthread_rwlock_unlock(&l)); + ASSERT_EQ(0, pthread_rwlock_unlock(&l)); + + // Write lock + ASSERT_EQ(0, pthread_rwlock_wrlock(&l)); + ASSERT_EQ(0, pthread_rwlock_unlock(&l)); + + // Try writer lock + ASSERT_EQ(0, pthread_rwlock_trywrlock(&l)); + ASSERT_EQ(EBUSY, pthread_rwlock_trywrlock(&l)); + ASSERT_EQ(EBUSY, pthread_rwlock_tryrdlock(&l)); + ASSERT_EQ(0, pthread_rwlock_unlock(&l)); + + // Try reader lock + ASSERT_EQ(0, pthread_rwlock_tryrdlock(&l)); + ASSERT_EQ(0, pthread_rwlock_tryrdlock(&l)); + ASSERT_EQ(EBUSY, pthread_rwlock_trywrlock(&l)); + ASSERT_EQ(0, pthread_rwlock_unlock(&l)); + ASSERT_EQ(0, pthread_rwlock_unlock(&l)); + + // Try writer lock after unlock + ASSERT_EQ(0, pthread_rwlock_wrlock(&l)); + ASSERT_EQ(0, pthread_rwlock_unlock(&l)); + +#ifdef __BIONIC__ + // EDEADLK in "read after write" + ASSERT_EQ(0, pthread_rwlock_wrlock(&l)); + ASSERT_EQ(EDEADLK, pthread_rwlock_rdlock(&l)); + ASSERT_EQ(0, pthread_rwlock_unlock(&l)); + + // EDEADLK in "write after write" ASSERT_EQ(0, pthread_rwlock_wrlock(&l)); + ASSERT_EQ(EDEADLK, pthread_rwlock_wrlock(&l)); ASSERT_EQ(0, pthread_rwlock_unlock(&l)); +#endif ASSERT_EQ(0, pthread_rwlock_destroy(&l)); } |