1
2 /* Needed for older glibcs (2.3 and older, at least) who don't
3 otherwise "know" about pthread_rwlock_anything or about
4 PTHREAD_MUTEX_RECURSIVE (amongst things). */
5 #define _GNU_SOURCE 1
6
7 #include <pthread.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <assert.h>
11 #include <unistd.h>
12
13 /* Test of the mechanism for showing all locks held by a thread. This
14 is like locked_vs_unlocked.c, except that it uses a recursively
15 lockable lock, and one thread holds the lock more than once. Point
16 is to check that the lock showing mechanism shows the
17 lock-number-of-times-held count. */
18
19 pthread_mutex_t mx;
20
21 int x = 0;
22
child_fn1(void * arg)23 void* child_fn1 ( void* arg )
24 {
25 int r;
26 r= pthread_mutex_lock(&mx); assert(!r);
27 r= pthread_mutex_lock(&mx); assert(!r);
28 x = 1;
29 r= pthread_mutex_unlock(&mx); assert(!r);
30 r= pthread_mutex_unlock(&mx); assert(!r);
31 sleep(1);
32 return NULL;
33 }
34
child_fn2(void * arg)35 void* child_fn2 ( void* arg )
36 {
37 sleep(1);
38 x = 1;
39 return NULL;
40 }
41
main(int argc,char ** argv)42 int main ( int argc, char** argv )
43 {
44 int r;
45 pthread_t child1, child2;
46 pthread_mutexattr_t attr;
47 r = pthread_mutexattr_init( &attr );
48 assert(!r);
49 r = pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE );
50 assert(!r);
51 r= pthread_mutex_init(&mx, &attr); assert(!r);
52
53 r= pthread_create(&child2, NULL, child_fn2, NULL); assert(!r);
54 r= pthread_create(&child1, NULL, child_fn1, NULL); assert(!r);
55
56 r= pthread_join(child1, NULL); assert(!r);
57 r= pthread_join(child2, NULL); assert(!r);
58
59 r= pthread_mutex_destroy(&mx); assert(!r);
60
61 return 0;
62 }
63