mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 00:16:11 +00:00
89 lines
1.7 KiB
C
89 lines
1.7 KiB
C
#include "../../config.h"
|
|
#include <assert.h>
|
|
#include <errno.h>
|
|
#include <pthread.h>
|
|
#include <signal.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
#ifdef HAVE_ASM_UNISTD_H
|
|
#include <asm/unistd.h> // __NR_gettid
|
|
#endif
|
|
#include "../drd.h"
|
|
|
|
|
|
static int s_debug = 0;
|
|
|
|
|
|
static int getktid()
|
|
{
|
|
#ifdef __NR_gettid
|
|
return syscall(__NR_gettid);
|
|
#else
|
|
return -1;
|
|
#endif
|
|
}
|
|
|
|
static void print_thread_id(const char* const label)
|
|
{
|
|
if (s_debug)
|
|
{
|
|
char msg[256];
|
|
snprintf(msg, sizeof(msg),
|
|
"%spid %ld / kernel thread ID %d / Valgrind thread ID %d\n",
|
|
label, (long) getpid(), getktid(), DRD_GET_VALGRIND_THREADID);
|
|
write(STDOUT_FILENO, msg, strlen(msg));
|
|
}
|
|
}
|
|
|
|
static void SignalHandler(const int iSignal)
|
|
{
|
|
print_thread_id("Signal was delivered to ");
|
|
}
|
|
|
|
void* thread_func(void* thread_arg)
|
|
{
|
|
print_thread_id("thread: ");
|
|
|
|
sleep(10);
|
|
//assert(result < 0 && errno == EINTR);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
pthread_t threadid;
|
|
struct timespec tsDelay;
|
|
|
|
// Primitive argument parsing.
|
|
if (argc > 1)
|
|
s_debug = 1;
|
|
|
|
print_thread_id("main: ");
|
|
|
|
{
|
|
struct sigaction sa;
|
|
memset(&sa, 0, sizeof(sa));
|
|
sa.sa_handler = &SignalHandler;
|
|
sigemptyset(&sa.sa_mask);
|
|
sigaction(SIGALRM, &sa, 0);
|
|
}
|
|
|
|
if (pthread_create(&threadid, 0, thread_func, 0) != 0) {
|
|
fprintf(stderr, "Thread creation failed\n");
|
|
return 1;
|
|
}
|
|
// Wait until the thread is inside clock_nanosleep().
|
|
tsDelay.tv_sec = 0;
|
|
tsDelay.tv_nsec = 20 * 1000 * 1000;
|
|
nanosleep(&tsDelay, 0);
|
|
// And send SIGALRM to the thread.
|
|
pthread_kill(threadid, SIGALRM);
|
|
pthread_join(threadid, 0);
|
|
|
|
return 0;
|
|
}
|