• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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