1 /** 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.
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). */
13 #include "../../config.h"
19 int main(int argc
, char** argv
)
22 pthread_mutex_t mutex
;
23 pthread_rwlock_t rwlock
;
24 struct timespec abs_timeout
;
26 time(&abs_timeout
.tv_sec
);
27 abs_timeout
.tv_nsec
= 0;
28 abs_timeout
.tv_sec
+= 10;
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");
38 #ifdef HAVE_PTHREAD_RWLOCK_TIMEDWRLOCK
39 r
= pthread_rwlock_timedwrlock(&rwlock
, &abs_timeout
); assert(r
== 0);
40 r
= pthread_rwlock_unlock(&rwlock
); assert(r
== 0);
42 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");
53 #ifdef HAVE_PTHREAD_RWLOCK_TIMEDRDLOCK
54 r
= pthread_rwlock_timedrdlock(&rwlock
, &abs_timeout
); assert(r
== 0);
55 r
= pthread_rwlock_unlock(&rwlock
); assert(r
== 0);
57 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);
61 r
= pthread_rwlock_destroy(&rwlock
); assert(r
== 0);
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");
71 #ifdef HAVE_PTHREAD_MUTEX_TIMEDLOCK
72 r
= pthread_mutex_timedlock(&mutex
, &abs_timeout
); assert(r
== 0);
73 r
= pthread_mutex_unlock(&mutex
); assert(r
== 0);
75 r
= pthread_mutex_destroy(&mutex
);