aboutsummaryrefslogtreecommitdiffstats
path: root/tests/pthread_test.cpp
diff options
context:
space:
mode:
authorCalin Juravle <calin@google.com>2014-05-19 13:41:10 +0100
committerCalin Juravle <calin@google.com>2014-05-22 11:11:15 +0100
commit76f352eec12d8938101e5ae33429c72797c3aa23 (patch)
tree56eed6c22d5365278b4184921e70bbae4d0e7523 /tests/pthread_test.cpp
parent9b95ea936a72532c3124963312d348c6ee453d78 (diff)
downloadandroid_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.cpp37
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));
}