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 <semaphore.h>
15#include <string.h>
16void start_watchdog ( void );
17int 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
36  /* this only fails with glibc 2.7 and later. */
37  r= sem_post(&s1);
38
39  sem_destroy(&s1);
40
41  return 0;
42}
43
44void* watchdog ( void* v )
45{
46  sleep(10);
47  fprintf(stderr, "watchdog timer expired - not a good sign\n");
48  exit(0);
49}
50
51void start_watchdog ( void )
52{
53  pthread_t t;
54  int r;
55  r= pthread_create(&t, NULL, watchdog, NULL);
56  assert(!r);
57}
58