mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
95 lines
1.9 KiB
C
95 lines
1.9 KiB
C
/* Check that Helgrind does not complain about semaphores with a
|
|
nonzero initial value, when said semaphores are correctly used.
|
|
Also useful for generating VCG of simple semaphore activity, for
|
|
inspection. */
|
|
|
|
#include <stdio.h>
|
|
#include <pthread.h>
|
|
#include <semaphore.h>
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
|
|
#define N_THREADS 3
|
|
|
|
static sem_t* my_sem_init(char*, int, unsigned);
|
|
static int my_sem_destroy(sem_t*);
|
|
static int my_sem_wait(sem_t*); //static int my_sem_post(sem_t*);
|
|
|
|
void* child_fn ( void* semV ) {
|
|
int r;
|
|
sem_t* sem = (sem_t*)semV;
|
|
r= my_sem_wait(sem); assert(!r);
|
|
return NULL;
|
|
}
|
|
|
|
int main ( void )
|
|
{
|
|
int r, i;
|
|
sem_t* sem;
|
|
pthread_t child[N_THREADS];
|
|
|
|
sem= my_sem_init("sem1", 0, N_THREADS); assert(sem);
|
|
|
|
for (i = 0; i < N_THREADS; i++) {
|
|
r= pthread_create( &child[i], NULL, child_fn, sem );
|
|
assert(!r);
|
|
}
|
|
|
|
for (i = 0; i < N_THREADS; i++) {
|
|
r= pthread_join( child[i], NULL );
|
|
assert(!r);
|
|
}
|
|
|
|
r= my_sem_destroy(sem); assert(!r);
|
|
return 0;
|
|
}
|
|
|
|
|
|
static sem_t* my_sem_init (char* identity, int pshared, unsigned count)
|
|
{
|
|
sem_t* s;
|
|
|
|
#if defined(VGO_linux) || defined(VGO_solaris)
|
|
s = malloc(sizeof(*s));
|
|
if (s) {
|
|
if (sem_init(s, pshared, count) < 0) {
|
|
perror("sem_init");
|
|
free(s);
|
|
s = NULL;
|
|
}
|
|
}
|
|
#elif defined(VGO_darwin)
|
|
char name[100];
|
|
sprintf(name, "anonsem_%s_pid%d", identity, (int)getpid());
|
|
name[ sizeof(name)-1 ] = 0;
|
|
if (0) printf("name = %s\n", name);
|
|
s = sem_open(name, O_CREAT | O_EXCL, 0600, count);
|
|
if (s == SEM_FAILED) {
|
|
perror("sem_open");
|
|
s = NULL;
|
|
}
|
|
#else
|
|
# error "Unsupported OS"
|
|
#endif
|
|
|
|
return s;
|
|
}
|
|
|
|
static int my_sem_destroy ( sem_t* s )
|
|
{
|
|
return sem_destroy(s);
|
|
}
|
|
|
|
static int my_sem_wait(sem_t* s)
|
|
{
|
|
return sem_wait(s);
|
|
}
|
|
|
|
#if 0
|
|
static int my_sem_post(sem_t* s)
|
|
{
|
|
return sem_post(s);
|
|
}
|
|
#endif
|