]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/valgrind/src/valgrind-3.6.0-svn/drd/tests/sigalrm.c
Inital import
[l4.git] / l4 / pkg / valgrind / src / valgrind-3.6.0-svn / drd / tests / sigalrm.c
1 #include "../../config.h"
2 #include <assert.h>
3 #include <errno.h>
4 #include <pthread.h>
5 #include <signal.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <time.h>
10 #include <unistd.h>
11 #ifdef HAVE_ASM_UNISTD_H
12 #include <asm/unistd.h> // __NR_gettid
13 #endif
14 #include "../drd.h"
15
16
17 static int s_debug = 0;
18
19
20 static int getktid()
21 {
22 #ifdef __NR_gettid
23   return syscall(__NR_gettid);
24 #else
25   return -1;
26 #endif
27 }
28
29 static void print_thread_id(const char* const label)
30 {
31   if (s_debug)
32   {
33     char msg[256];
34     snprintf(msg, sizeof(msg),
35              "%spid %d / kernel thread ID %d / Valgrind thread ID %d\n",
36              label, getpid(), getktid(), DRD_GET_VALGRIND_THREADID);
37     write(STDOUT_FILENO, msg, strlen(msg));
38   }
39 }
40
41 static void SignalHandler(const int iSignal)
42 {
43   print_thread_id("Signal was delivered to ");
44 }
45
46 void* thread_func(void* thread_arg)
47 {
48   print_thread_id("thread: ");
49
50   sleep(10);
51   //assert(result < 0 && errno == EINTR);
52
53   return 0;
54 }
55
56 int main(int argc, char** argv)
57 {
58   int vgthreadid;
59   pthread_t threadid;
60   struct timespec tsDelay;
61
62   // Primitive argument parsing.
63   if (argc > 1)
64     s_debug = 1;
65
66   vgthreadid = DRD_GET_VALGRIND_THREADID;
67
68   print_thread_id("main: ");
69
70   {
71     struct sigaction sa;
72     memset(&sa, 0, sizeof(sa));
73     sa.sa_handler = &SignalHandler;
74     sigemptyset(&sa.sa_mask);
75     sigaction(SIGALRM, &sa, 0);
76   }
77
78   pthread_create(&threadid, 0, thread_func, 0);
79   // Wait until the thread is inside clock_nanosleep().
80   tsDelay.tv_sec = 0;
81   tsDelay.tv_nsec = 20 * 1000 * 1000;
82   nanosleep(&tsDelay, 0);
83   // And send SIGALRM to the thread.
84   pthread_kill(threadid, SIGALRM);
85   pthread_join(threadid, 0);
86
87   return 0;
88 }