Home | History | Annotate | Download | only in tests
      1 /* Check that Helgrind does not complain about semaphores with a
      2    nonzero initial value, when said semaphores are correctly used.
      3    Also useful for generating VCG of simple semaphore activity, for
      4    inspection. */
      5 
      6 #include <stdio.h>
      7 #include <pthread.h>
      8 #include <semaphore.h>
      9 #include <assert.h>
     10 #include <stdlib.h>
     11 #include <unistd.h>
     12 
     13 #define N_THREADS 3
     14 
     15 static sem_t* my_sem_init(char*, int, unsigned);
     16 static int my_sem_destroy(sem_t*);
     17 static int my_sem_wait(sem_t*); //static int my_sem_post(sem_t*);
     18 
     19 void* child_fn ( void* semV ) {
     20    int r;
     21    sem_t* sem = (sem_t*)semV;
     22    r= my_sem_wait(sem); assert(!r);
     23    return NULL;
     24 }
     25 
     26 int main ( void )
     27 {
     28    int r, i;
     29    sem_t* sem;
     30    pthread_t child[N_THREADS];
     31 
     32    sem= my_sem_init("sem1", 0, N_THREADS); assert(sem);
     33 
     34    for (i = 0; i < N_THREADS; i++) {
     35       r= pthread_create( &child[i], NULL, child_fn, sem );
     36       assert(!r);
     37    }
     38 
     39    for (i = 0; i < N_THREADS; i++) {
     40       r= pthread_join( child[i], NULL );
     41       assert(!r);
     42    }
     43 
     44    r= my_sem_destroy(sem); assert(!r);
     45    return 0;
     46 }
     47 
     48 
     49 static sem_t* my_sem_init (char* identity, int pshared, unsigned count)
     50 {
     51    sem_t* s;
     52 
     53 #if defined(VGO_linux) || defined(VGO_solaris)
     54    s = malloc(sizeof(*s));
     55    if (s) {
     56       if (sem_init(s, pshared, count) < 0) {
     57 	 perror("sem_init");
     58 	 free(s);
     59 	 s = NULL;
     60       }
     61    }
     62 #elif defined(VGO_darwin)
     63    char name[100];
     64    sprintf(name, "anonsem_%s_pid%d", identity, (int)getpid());
     65    name[ sizeof(name)-1 ] = 0;
     66    if (0) printf("name = %s\n", name);
     67    s = sem_open(name, O_CREAT | O_EXCL, 0600, count);
     68    if (s == SEM_FAILED) {
     69       perror("sem_open");
     70       s = NULL;
     71    }
     72 #else
     73 #  error "Unsupported OS"
     74 #endif
     75 
     76    return s;
     77 }
     78 
     79 static int my_sem_destroy ( sem_t* s )
     80 {
     81    return sem_destroy(s);
     82 }
     83 
     84 static int my_sem_wait(sem_t* s)
     85 {
     86   return sem_wait(s);
     87 }
     88 
     89 #if 0
     90 static int my_sem_post(sem_t* s)
     91 {
     92   return sem_post(s);
     93 }
     94 #endif
     95