]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/valgrind/src/valgrind-3.6.0-svn/helgrind/tests/tc18_semabuse.c
Inital import
[l4.git] / l4 / pkg / valgrind / src / valgrind-3.6.0-svn / helgrind / tests / tc18_semabuse.c
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>
16 void start_watchdog ( void );
17 int main ( void )
18 {
19   int r;
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
44 void* watchdog ( void* v )
45 {
46   sleep(10);
47   fprintf(stderr, "watchdog timer expired - not a good sign\n");
48   exit(0);
49 }
50
51 void start_watchdog ( void )
52 {
53   pthread_t t;
54   int r;
55   r= pthread_create(&t, NULL, watchdog, NULL);
56   assert(!r);
57 }