Mutex-free implementation of pthread_rwlock
Bug: 8133149 Change-Id: Id6775010d95f2634b173daa55d87a59a3cf4131b
This commit is contained in:
@@ -551,12 +551,49 @@ 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));
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user