1 2 /* Do stupid things with semaphores, and check that Thrcheck doesn't 3 fall over and does report errors appropriately. If nothing else 4 this just checks that the relevant functions are getting 5 intercepted. */ 6 7 /* This is pretty lame, because making the sem_ functions fail is 8 difficult. Not sure it's really worth having. */ 9 #include <unistd.h> 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <assert.h> 13 #include <pthread.h> 14 #include "safe-semaphore.h" 15 #include <string.h> 16 void start_watchdog ( void ); 17 int main ( void ) 18 { 19 int r __attribute__((unused)); 20 sem_t s1; 21 start_watchdog(); 22 /* Do sem_init with huge initial count */ 23 r= sem_init(&s1, 0, ~0); 24 25 /* initialise properly */ 26 r= sem_init(&s1, 0, 0); 27 28 /* in glibc, sem_destroy is a no-op; making it fail is 29 impossible. */ 30 31 /* Do 'wait' on a bogus semaphore. This should fail, but on glibc 32 it succeeds. */ 33 memset(&s1, 0x55, sizeof(s1)); 34 r= sem_wait(&s1); /* assert(r != 0); */ 35 #if defined(VGO_solaris) 36 assert(r != 0); 37 #endif 38 39 /* this only fails with glibc 2.7 and later. */ 40 r= sem_post(&s1); 41 42 sem_destroy(&s1); 43 44 return 0; 45 } 46 47 void* watchdog ( void* v ) 48 { 49 sleep(10); 50 fprintf(stderr, "watchdog timer expired - not a good sign\n"); 51 exit(0); 52 } 53 54 void start_watchdog ( void ) 55 { 56 pthread_t t; 57 int r; 58 r= pthread_create(&t, NULL, watchdog, NULL); 59 assert(!r); 60 } 61