Home | History | Annotate | Download | only in tests
      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 
     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 
     35 void* child_fn2 ( void* arg )
     36 {
     37    sleep(1);
     38    x = 1;
     39    return NULL;
     40 }
     41 
     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