/* Do stupid things with semaphores, and check that Thrcheck doesn't fall over and does report errors appropriately. If nothing else this just checks that the relevant functions are getting intercepted. */ /* This is pretty lame, because making the sem_ functions fail is difficult. Not sure it's really worth having. */ #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <pthread.h> #include "safe-semaphore.h" #include <string.h> void start_watchdog ( void ); int main ( void ) { int r __attribute__((unused)); sem_t s1; start_watchdog(); /* Do sem_init with huge initial count */ r= sem_init(&s1, 0, ~0); /* initialise properly */ r= sem_init(&s1, 0, 0); /* in glibc, sem_destroy is a no-op; making it fail is impossible. */ /* Do 'wait' on a bogus semaphore. This should fail, but on glibc it succeeds. */ memset(&s1, 0x55, sizeof(s1)); r= sem_wait(&s1); /* assert(r != 0); */ #if defined(VGO_solaris) assert(r != 0); #endif /* this only fails with glibc 2.7 and later. */ r= sem_post(&s1); sem_destroy(&s1); return 0; } void* watchdog ( void* v ) { sleep(10); fprintf(stderr, "watchdog timer expired - not a good sign\n"); exit(0); } void start_watchdog ( void ) { pthread_t t; int r; r= pthread_create(&t, NULL, watchdog, NULL); assert(!r); }