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.
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
13 #include "../../config.h"
14 #include <stdio.h>
15 #include <assert.h>
16 #include <pthread.h>
17
18
main(int argc,char ** argv)19 int 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
26 time(&abs_timeout.tv_sec);
27 abs_timeout.tv_nsec = 0;
28 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");
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);
41 #endif
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);
56 #endif
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);
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");
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);
74 #endif
75 r = pthread_mutex_destroy(&mutex);
76
77 return 0;
78 }
79