Home | History | Annotate | Download | only in tests
      1 
      2 /* This is the most trivial test I could think of that involves
      3    barriers.  If H fails to notice the pthread_barrier_wait call then
      4    it will report a race.  Correct behaviour is not to report a race
      5    (there isn't one.) */
      6 #define _GNU_SOURCE
      7 #include <pthread.h>
      8 #include <stdio.h>
      9 #include <stdlib.h>
     10 #include <assert.h>
     11 #include <unistd.h>
     12 
     13 int x = 0;
     14 
     15 pthread_barrier_t bar;
     16 
     17 void* child_fn ( void* arg )
     18 {
     19    long r, n = (long)arg;
     20 
     21    if (n == 1) x++;
     22 
     23    r = pthread_barrier_wait(&bar);
     24    assert(r == 0 || r == PTHREAD_BARRIER_SERIAL_THREAD);
     25 
     26    if (n == 0) x++;
     27 
     28    sleep(1); /* ensure both threads get to this point before
     29                 either exits. */
     30    return NULL;
     31 }
     32 
     33 #define NTHR 2
     34 
     35 int main ( void )
     36 {
     37    long i, r;
     38    pthread_t thr[NTHR];
     39 
     40    r = pthread_barrier_init(&bar, NULL, NTHR);
     41    assert(!r);
     42 
     43    for (i = 0; i < NTHR; i++) {
     44       r = pthread_create(&thr[i], NULL, child_fn, (void*)i);
     45       assert(!r);
     46    }
     47 
     48    for (i = 0; i < NTHR; i++) {
     49       r = pthread_join(thr[i], NULL);
     50       assert(!r);
     51    }
     52 
     53    r = pthread_barrier_destroy(&bar); assert(!r);
     54 
     55    printf("x = %d\n", x);
     56    return 0;
     57 }
     58