Home | History | Annotate | Download | only in tests
      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