Mutex-free implementation of pthread_rwlock
Bug: 8133149
Change-Id: Id6775010d95f2634b173daa55d87a59a3cf4131b
diff --git a/tests/pthread_test.cpp b/tests/pthread_test.cpp
index fa66d21..8015404 100644
--- a/tests/pthread_test.cpp
+++ b/tests/pthread_test.cpp
@@ -551,12 +551,49 @@
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));
}