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