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
17static int s_debug = 0;
18
19
20static int getktid()
21{
22#ifdef __NR_gettid
23  return syscall(__NR_gettid);
24#else
25  return -1;
26#endif
27}
28
29static 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
41static void SignalHandler(const int iSignal)
42{
43  print_thread_id("Signal was delivered to ");
44}
45
46void* 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
56int main(int argc, char** argv)
57{
58  pthread_t threadid;
59  struct timespec tsDelay;
60
61  // Primitive argument parsing.
62  if (argc > 1)
63    s_debug = 1;
64
65  print_thread_id("main: ");
66
67  {
68    struct sigaction sa;
69    memset(&sa, 0, sizeof(sa));
70    sa.sa_handler = &SignalHandler;
71    sigemptyset(&sa.sa_mask);
72    sigaction(SIGALRM, &sa, 0);
73  }
74
75  if (pthread_create(&threadid, 0, thread_func, 0) != 0) {
76    fprintf(stderr, "Thread creation failed\n");
77    return 1;
78  }
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}
89