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
19int 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