Home | History | Annotate | Download | only in tests
      1 
      2 /* Check that an error is reported for various kinds of bogus
      3    pthread_mutex_unlock calls. */
      4 
      5 #include <pthread.h>
      6 #include <stdio.h>
      7 #include <stdlib.h>
      8 
      9 void* child_fn ( void* arg )
     10 {
     11    pthread_mutex_unlock( (pthread_mutex_t*)arg ); /* ERROR */
     12    return NULL;
     13 }
     14 
     15 void nearly_main ( void )
     16 {
     17    pthread_t child;
     18    pthread_mutex_t mx1, mx2;
     19    int bogus[100], i;
     20    /* fill bogus with values which will cause glibc's pth_mx_unlock to fail */
     21    for (i = 0; i < 100; i++) bogus[i] = 0xFFFFFFFF;
     22    /* Unlocking a lock that is already unlocked */
     23    pthread_mutex_init( &mx1, NULL );
     24    pthread_mutex_lock( &mx1 );
     25    pthread_mutex_unlock( &mx1 );
     26 
     27    pthread_mutex_unlock( &mx1 ); /* ERROR */
     28 
     29    /* Unlocking a lock that is held by a different thread */
     30 
     31    pthread_mutex_init( &mx2, NULL );
     32    pthread_mutex_lock( &mx2 );
     33    // start child and get it to unlock this lock
     34 
     35    pthread_create( &child, NULL, child_fn, (void*)&mx2 );
     36       /* child runs and attempts to unlock our lock.  Error
     37          is reported in child_fn. */
     38    pthread_join(child, NULL );
     39 
     40    /* Unlocking a totally bogus lock. */
     41    pthread_mutex_unlock( (pthread_mutex_t*) &bogus[50] ); /* ERROR */
     42 
     43    /* Now we get a freeing-locked-lock error, since the stack
     44       frame is removed whilst mx2 is still locked. */
     45 }
     46 
     47 int main ( void )
     48 {
     49    nearly_main(); fprintf(stderr, "---------------------\n" );
     50    nearly_main();
     51    return 0;
     52 }
     53