Use pthread calls instead of raw syscalls on non-Linux systems

Raw system calls aren't portable to other kernels.

Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
Alan Coopersmith 2014-12-23 19:07:10 -08:00 committed by Daniel Vetter
parent cf93bc8df9
commit 99e6defbe7
3 changed files with 27 additions and 6 deletions

View File

@ -45,7 +45,11 @@
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#ifdef __linux__
#include <sys/syscall.h>
#else
#include <pthread.h>
#endif
#include <sys/utsname.h>
#include <termios.h>
#include <errno.h>
@ -1260,8 +1264,6 @@ static void igt_atexit_handler(void)
static void fatal_sig_handler(int sig)
{
pid_t pid, tid;
restore_all_sig_handler();
/*
@ -1270,11 +1272,20 @@ static void fatal_sig_handler(int sig)
*/
call_exit_handlers(sig);
{
#ifdef __linux__
/* Workaround cached PID and TID races on glibc and Bionic libc. */
pid = syscall(SYS_getpid);
tid = syscall(SYS_gettid);
pid_t pid = syscall(SYS_getpid);
pid_t tid = syscall(SYS_gettid);
syscall(SYS_tgkill, pid, tid, sig);
syscall(SYS_tgkill, pid, tid, sig);
#else
pthread_t tid = pthread_self();
union sigval value = { .sival_ptr = NULL };
pthread_sigqueue(tid, sig, value);
#endif
}
}
/**

View File

@ -37,7 +37,11 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#ifdef __linux__
# include <sys/syscall.h>
#else
# include <pthread.h>
#endif
#include "drm.h"
#include "ioctl_wrappers.h"
@ -47,7 +51,9 @@
static bool
is_local_tid(pid_t tid)
{
#ifndef ANDROID
#ifndef __linux__
return pthread_self() == tid;
#elif !defined(ANDROID)
/* On Linux systems, drmGetClient() would return the thread ID
instead of the actual process ID */
return syscall(SYS_gettid) == tid;

View File

@ -121,7 +121,11 @@ static void start_test(void)
static void * test_thread(void * par)
{
#ifdef __linux__
igt_debug("start %ld\n", syscall(SYS_gettid));
#else
igt_debug("start %ld\n", (long) pthread_self());
#endif
start_test();
return NULL;