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
12 #if defined(VGO_freebsd)
13 # include <sys/fcntl.h>
18 static sem_t
* my_sem_init(char*, int, unsigned);
19 static int my_sem_destroy(sem_t
*);
20 static int my_sem_wait(sem_t
*); //static int my_sem_post(sem_t*);
22 void* child_fn ( void* semV
) {
24 sem_t
* sem
= (sem_t
*)semV
;
25 r
= my_sem_wait(sem
); assert(!r
);
33 pthread_t child
[N_THREADS
];
35 sem
= my_sem_init("sem1", 0, N_THREADS
); assert(sem
);
37 for (i
= 0; i
< N_THREADS
; i
++) {
38 r
= pthread_create( &child
[i
], NULL
, child_fn
, sem
);
42 for (i
= 0; i
< N_THREADS
; i
++) {
43 r
= pthread_join( child
[i
], NULL
);
47 r
= my_sem_destroy(sem
); assert(!r
);
52 static sem_t
* my_sem_init (char* identity
, int pshared
, unsigned count
)
56 #if defined(VGO_linux) || defined(VGO_solaris) || defined(VGO_freebsd)
57 s
= malloc(sizeof(*s
));
59 if (sem_init(s
, pshared
, count
) < 0) {
65 #elif defined(VGO_darwin)
67 sprintf(name
, "anonsem_%s_pid%d", identity
, (int)getpid());
68 name
[ sizeof(name
)-1 ] = 0;
69 if (0) printf("name = %s\n", name
);
70 s
= sem_open(name
, O_CREAT
| O_EXCL
, 0600, count
);
71 if (s
== SEM_FAILED
) {
76 # error "Unsupported OS"
82 static int my_sem_destroy ( sem_t
* s
)
84 return sem_destroy(s
);
87 static int my_sem_wait(sem_t
* s
)
93 static int my_sem_post(sem_t
* s
)