#include #include #include int ret; void check_ret(void) { switch (ret) { case 0: puts(" OK"); break; case EDEADLK: puts(" deadlock"); break; case ETIMEDOUT: puts(" timed out"); break; case EINVAL: puts(" invalid"); break; case EBUSY: puts(" busy"); break; default: printf(" unhandled error %d\n", ret); break; } } int main(void) { struct timespec wait; wait.tv_sec = time(NULL) + 5; wait.tv_nsec = 0; pthread_rwlock_t rwlock; ret = pthread_rwlock_init(&rwlock, NULL); /* Trying while holding write lock */ printf("Acquiring write lock...\n"); ret = pthread_rwlock_wrlock(&rwlock); check_ret(); printf("Trying to acquire write lock...\n"); ret = pthread_rwlock_trywrlock(&rwlock); check_ret(); printf("Acquiring timed write lock...\n"); ret = pthread_rwlock_timedwrlock(&rwlock, &wait); check_ret(); printf("Trying to acquire read lock...\n"); ret = pthread_rwlock_tryrdlock(&rwlock); check_ret(); printf("Acquiring timed read lock...\n"); ret = pthread_rwlock_timedrdlock(&rwlock, &wait); check_ret(); printf("Acquiring read lock...\n"); ret = pthread_rwlock_rdlock(&rwlock); check_ret(); printf("Releasing write lock.\n"); pthread_rwlock_unlock(&rwlock); /* Trying while holding read lock */ printf("Acquiring read lock...\n"); ret = pthread_rwlock_rdlock(&rwlock); check_ret(); printf("Trying to acquire write lock...\n"); ret = pthread_rwlock_trywrlock(&rwlock); check_ret(); printf("Acquiring timed write lock...\n"); ret = pthread_rwlock_timedwrlock(&rwlock, &wait); check_ret(); printf("Trying to acquire read lock...\n"); ret = pthread_rwlock_tryrdlock(&rwlock); check_ret(); printf("Acquiring timed read lock...\n"); ret = pthread_rwlock_timedrdlock(&rwlock, &wait); check_ret(); printf("Acquiring read lock...\n"); ret = pthread_rwlock_rdlock(&rwlock); check_ret(); printf("Releasing read lock.\n"); pthread_rwlock_unlock(&rwlock); pthread_rwlock_destroy(&rwlock); return (0); }