1006f29fff130edea9cab1ac977296260cb212bbdsewardj/* Check that Helgrind does not complain about semaphores with a 2006f29fff130edea9cab1ac977296260cb212bbdsewardj nonzero initial value, when said semaphores are correctly used. 3006f29fff130edea9cab1ac977296260cb212bbdsewardj Also useful for generating VCG of simple semaphore activity, for 4006f29fff130edea9cab1ac977296260cb212bbdsewardj inspection. */ 5310c8f23ad423be7b3527763ecf4ceccfba7aac8bart 6e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj#include <stdio.h> 7006f29fff130edea9cab1ac977296260cb212bbdsewardj#include <pthread.h> 8006f29fff130edea9cab1ac977296260cb212bbdsewardj#include <semaphore.h> 9006f29fff130edea9cab1ac977296260cb212bbdsewardj#include <assert.h> 10310c8f23ad423be7b3527763ecf4ceccfba7aac8bart#include <stdlib.h> 11e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj#include <unistd.h> 12310c8f23ad423be7b3527763ecf4ceccfba7aac8bart 13006f29fff130edea9cab1ac977296260cb212bbdsewardj#define N_THREADS 3 14310c8f23ad423be7b3527763ecf4ceccfba7aac8bart 15310c8f23ad423be7b3527763ecf4ceccfba7aac8bartstatic sem_t* my_sem_init(char*, int, unsigned); 16e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardjstatic int my_sem_destroy(sem_t*); 17e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardjstatic int my_sem_wait(sem_t*); //static int my_sem_post(sem_t*); 18310c8f23ad423be7b3527763ecf4ceccfba7aac8bart 19e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardjvoid* child_fn ( void* semV ) { 20006f29fff130edea9cab1ac977296260cb212bbdsewardj int r; 21006f29fff130edea9cab1ac977296260cb212bbdsewardj sem_t* sem = (sem_t*)semV; 22e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj r= my_sem_wait(sem); assert(!r); 23006f29fff130edea9cab1ac977296260cb212bbdsewardj return NULL; 24006f29fff130edea9cab1ac977296260cb212bbdsewardj} 25006f29fff130edea9cab1ac977296260cb212bbdsewardj 26006f29fff130edea9cab1ac977296260cb212bbdsewardjint main ( void ) 27006f29fff130edea9cab1ac977296260cb212bbdsewardj{ 28006f29fff130edea9cab1ac977296260cb212bbdsewardj int r, i; 29310c8f23ad423be7b3527763ecf4ceccfba7aac8bart sem_t* sem; 30006f29fff130edea9cab1ac977296260cb212bbdsewardj pthread_t child[N_THREADS]; 31006f29fff130edea9cab1ac977296260cb212bbdsewardj 32310c8f23ad423be7b3527763ecf4ceccfba7aac8bart sem= my_sem_init("sem1", 0, N_THREADS); assert(sem); 33006f29fff130edea9cab1ac977296260cb212bbdsewardj 34006f29fff130edea9cab1ac977296260cb212bbdsewardj for (i = 0; i < N_THREADS; i++) { 35310c8f23ad423be7b3527763ecf4ceccfba7aac8bart r= pthread_create( &child[i], NULL, child_fn, sem ); 36006f29fff130edea9cab1ac977296260cb212bbdsewardj assert(!r); 37006f29fff130edea9cab1ac977296260cb212bbdsewardj } 38006f29fff130edea9cab1ac977296260cb212bbdsewardj 39006f29fff130edea9cab1ac977296260cb212bbdsewardj for (i = 0; i < N_THREADS; i++) { 40006f29fff130edea9cab1ac977296260cb212bbdsewardj r= pthread_join( child[i], NULL ); 41006f29fff130edea9cab1ac977296260cb212bbdsewardj assert(!r); 42006f29fff130edea9cab1ac977296260cb212bbdsewardj } 43006f29fff130edea9cab1ac977296260cb212bbdsewardj 44310c8f23ad423be7b3527763ecf4ceccfba7aac8bart r= my_sem_destroy(sem); assert(!r); 45006f29fff130edea9cab1ac977296260cb212bbdsewardj return 0; 46006f29fff130edea9cab1ac977296260cb212bbdsewardj} 47e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj 48e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj 49310c8f23ad423be7b3527763ecf4ceccfba7aac8bartstatic sem_t* my_sem_init (char* identity, int pshared, unsigned count) 50e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj{ 51310c8f23ad423be7b3527763ecf4ceccfba7aac8bart sem_t* s; 52310c8f23ad423be7b3527763ecf4ceccfba7aac8bart 53e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj#if defined(VGO_linux) 54310c8f23ad423be7b3527763ecf4ceccfba7aac8bart s = malloc(sizeof(*s)); 55310c8f23ad423be7b3527763ecf4ceccfba7aac8bart if (s) { 56310c8f23ad423be7b3527763ecf4ceccfba7aac8bart if (sem_init(s, pshared, count) < 0) { 57310c8f23ad423be7b3527763ecf4ceccfba7aac8bart perror("sem_init"); 58310c8f23ad423be7b3527763ecf4ceccfba7aac8bart free(s); 59310c8f23ad423be7b3527763ecf4ceccfba7aac8bart s = NULL; 60310c8f23ad423be7b3527763ecf4ceccfba7aac8bart } 61310c8f23ad423be7b3527763ecf4ceccfba7aac8bart } 62e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj#elif defined(VGO_darwin) 63e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj char name[100]; 64e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj sprintf(name, "anonsem_%s_pid%d", identity, (int)getpid()); 65e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj name[ sizeof(name)-1 ] = 0; 66e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj if (0) printf("name = %s\n", name); 67310c8f23ad423be7b3527763ecf4ceccfba7aac8bart s = sem_open(name, O_CREAT | O_EXCL, 0600, count); 68310c8f23ad423be7b3527763ecf4ceccfba7aac8bart if (s == SEM_FAILED) { 69310c8f23ad423be7b3527763ecf4ceccfba7aac8bart perror("sem_open"); 70310c8f23ad423be7b3527763ecf4ceccfba7aac8bart s = NULL; 71310c8f23ad423be7b3527763ecf4ceccfba7aac8bart } 72e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj#else 73e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj# error "Unsupported OS" 74e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj#endif 75310c8f23ad423be7b3527763ecf4ceccfba7aac8bart 76310c8f23ad423be7b3527763ecf4ceccfba7aac8bart return s; 77e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj} 78e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj 79e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardjstatic int my_sem_destroy ( sem_t* s ) 80e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj{ 81e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj return sem_destroy(s); 82e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj} 83e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj 84e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardjstatic int my_sem_wait(sem_t* s) 85e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj{ 86e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj return sem_wait(s); 87e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj} 88e84c7f437ada7b7ceade1a00498f663e15ea7b57sewardj 89310c8f23ad423be7b3527763ecf4ceccfba7aac8bart#if 0 90310c8f23ad423be7b3527763ecf4ceccfba7aac8bartstatic int my_sem_post(sem_t* s) 91310c8f23ad423be7b3527763ecf4ceccfba7aac8bart{ 92310c8f23ad423be7b3527763ecf4ceccfba7aac8bart return sem_post(s); 93310c8f23ad423be7b3527763ecf4ceccfba7aac8bart} 94310c8f23ad423be7b3527763ecf4ceccfba7aac8bart#endif 95