blob: 17f2fb6e3d41cb9f0bb4903d38e19fb6f27a684c [file] [log] [blame]
bart7e9aec52008-03-03 07:40:54 +00001/** Test interception of the various pthread_timed*lock() and pthread_try*lock()
2 * functions. If any of these are not intercepted, an error message will be
3 * printed at unlock time.
4 */
5
6
7/* Needed for older glibc's (2.3 and older, at least) who don't
8 otherwise "know" about pthread_rwlock_anything or about
9 PTHREAD_MUTEX_RECURSIVE (amongst things). */
10
11#define _GNU_SOURCE 1
12
bart3826d582009-01-20 13:57:50 +000013#include "../../config.h"
bart848fdf82008-03-02 19:03:19 +000014#include <stdio.h>
15#include <assert.h>
16#include <pthread.h>
17
bart7e9aec52008-03-03 07:40:54 +000018
bart848fdf82008-03-02 19:03:19 +000019int main(int argc, char** argv)
20{
21 int r;
22 pthread_mutex_t mutex;
23 pthread_rwlock_t rwlock;
24 struct timespec abs_timeout;
25
barted200502009-01-16 11:57:50 +000026 time(&abs_timeout.tv_sec);
27 abs_timeout.tv_nsec = 0;
bart848fdf82008-03-02 19:03:19 +000028 abs_timeout.tv_sec += 10;
29
30 r = pthread_rwlock_init(&rwlock, NULL); assert(r == 0);
31 fprintf(stderr, "Locking rwlock via pthread_rwlock_wrlock().\n");
32 r = pthread_rwlock_wrlock(&rwlock); assert(r == 0);
33 r = pthread_rwlock_unlock(&rwlock); assert(r == 0);
34 fprintf(stderr, "Locking rwlock via pthread_rwlock_trywrlock().\n");
35 r = pthread_rwlock_trywrlock(&rwlock); assert(r == 0);
36 r = pthread_rwlock_unlock(&rwlock); assert(r == 0);
37 fprintf(stderr, "Locking rwlock via pthread_rwlock_timedwrlock().\n");
bart3826d582009-01-20 13:57:50 +000038#ifdef HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK
bart848fdf82008-03-02 19:03:19 +000039 r = pthread_rwlock_timedwrlock(&rwlock, &abs_timeout); assert(r == 0);
40 r = pthread_rwlock_unlock(&rwlock); assert(r == 0);
bart3826d582009-01-20 13:57:50 +000041#endif
bart848fdf82008-03-02 19:03:19 +000042 fprintf(stderr, "Locking rwlock via pthread_rwlock_rdlock().\n");
43 r = pthread_rwlock_rdlock(&rwlock); assert(r == 0);
44 r = pthread_rwlock_rdlock(&rwlock); assert(r == 0);
45 r = pthread_rwlock_rdlock(&rwlock); assert(r == 0);
46 r = pthread_rwlock_unlock(&rwlock); assert(r == 0);
47 r = pthread_rwlock_unlock(&rwlock); assert(r == 0);
48 r = pthread_rwlock_unlock(&rwlock); assert(r == 0);
49 fprintf(stderr, "Locking rwlock via pthread_rwlock_tryrdlock().\n");
50 r = pthread_rwlock_tryrdlock(&rwlock); assert(r == 0);
51 r = pthread_rwlock_unlock(&rwlock); assert(r == 0);
52 fprintf(stderr, "Locking rwlock via pthread_rwlock_timedrdlock().\n");
bart3826d582009-01-20 13:57:50 +000053#ifdef HAVE_PTHREAD_RWLOCK_TIMEDRDLOCK
bart848fdf82008-03-02 19:03:19 +000054 r = pthread_rwlock_timedrdlock(&rwlock, &abs_timeout); assert(r == 0);
55 r = pthread_rwlock_unlock(&rwlock); assert(r == 0);
bart3826d582009-01-20 13:57:50 +000056#endif
bart4c45c242008-03-03 17:40:31 +000057 fprintf(stderr, "Attempt to lock for writing recursively (not allowed).\n");
58 r = pthread_rwlock_wrlock(&rwlock); assert(r == 0);
59 r = pthread_rwlock_wrlock(&rwlock); assert(r != 0);
60 r = pthread_rwlock_unlock(&rwlock); assert(r == 0);
bart848fdf82008-03-02 19:03:19 +000061 r = pthread_rwlock_destroy(&rwlock); assert(r == 0);
62
63 r = pthread_mutex_init(&mutex, NULL); assert(r == 0);
64 fprintf(stderr, "Locking mutex via pthread_mutex_trylock().\n");
65 r = pthread_mutex_trylock(&mutex); assert(r == 0);
66 r = pthread_mutex_unlock(&mutex); assert(r == 0);
67 fprintf(stderr, "Locking mutex via pthread_mutex_lock().\n");
68 r = pthread_mutex_lock(&mutex); assert(r == 0);
69 r = pthread_mutex_unlock(&mutex); assert(r == 0);
70 fprintf(stderr, "Locking mutex via pthread_mutex_timedlock().\n");
njna7d4ca32009-01-20 22:54:50 +000071#ifdef HAVE_PTHREAD_MUTEX_TIMEDLOCK
bart848fdf82008-03-02 19:03:19 +000072 r = pthread_mutex_timedlock(&mutex, &abs_timeout); assert(r == 0);
73 r = pthread_mutex_unlock(&mutex); assert(r == 0);
njna7d4ca32009-01-20 22:54:50 +000074#endif
bart848fdf82008-03-02 19:03:19 +000075 r = pthread_mutex_destroy(&mutex); assert(r == 0);
76
77 return 0;
78}