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 15static sem_t* my_sem_init(char*, int, unsigned); 16static int my_sem_destroy(sem_t*); 17static int my_sem_wait(sem_t*); //static int my_sem_post(sem_t*); 18 19void* 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 26int 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 49static sem_t* my_sem_init (char* identity, int pshared, unsigned count) 50{ 51 sem_t* s; 52 53#if defined(VGO_linux) 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 79static int my_sem_destroy ( sem_t* s ) 80{ 81 return sem_destroy(s); 82} 83 84static int my_sem_wait(sem_t* s) 85{ 86 return sem_wait(s); 87} 88 89#if 0 90static int my_sem_post(sem_t* s) 91{ 92 return sem_post(s); 93} 94#endif 95