From bf3d4465289f605b0cfd1b31749845de4aaee837 Mon Sep 17 00:00:00 2001 From: Viktor Kutuzov Date: Thu, 11 Dec 2014 17:42:29 +0000 Subject: [PATCH] [Tsan] Fix the signal_recursive.cc test to pass on systems with high loads Differential Revision: http://reviews.llvm.org/D6504 llvm-svn: 224030 --- compiler-rt/test/tsan/process_sleep.h | 7 +++++++ compiler-rt/test/tsan/signal_recursive.cc | 27 ++++++++++++++------------- 2 files changed, 21 insertions(+), 13 deletions(-) create mode 100644 compiler-rt/test/tsan/process_sleep.h diff --git a/compiler-rt/test/tsan/process_sleep.h b/compiler-rt/test/tsan/process_sleep.h new file mode 100644 index 0000000..5938a42 --- /dev/null +++ b/compiler-rt/test/tsan/process_sleep.h @@ -0,0 +1,7 @@ +#include + +static void process_sleep(int sec) { + clock_t beg = clock(); + while((clock() - beg) / CLOCKS_PER_SEC < sec) + usleep(100); +} diff --git a/compiler-rt/test/tsan/signal_recursive.cc b/compiler-rt/test/tsan/signal_recursive.cc index d92ba97..bbb6807 100644 --- a/compiler-rt/test/tsan/signal_recursive.cc +++ b/compiler-rt/test/tsan/signal_recursive.cc @@ -11,6 +11,8 @@ #include #include +#include "process_sleep.h" + static const int kSigSuspend = SIGUSR1; static const int kSigRestart = SIGUSR2; static sigset_t g_suspend_handler_mask; @@ -59,33 +61,30 @@ static void RestartHandler(int sig) { } static void StopWorld(pthread_t thread) { - int result = pthread_kill(thread, kSigSuspend); - if (result != 0) + if (pthread_kill(thread, kSigSuspend) != 0) fail("pthread_kill failed"); - while ((result = sem_wait(&g_thread_suspend_ack_sem)) != 0) { - if (result != EINTR) { + while (sem_wait(&g_thread_suspend_ack_sem) != 0) { + if (errno != EINTR) fail("sem_wait failed"); - } } } static void StartWorld(pthread_t thread) { - int result = pthread_kill(thread, kSigRestart); - if (result != 0) + if (pthread_kill(thread, kSigRestart) != 0) fail("pthread_kill failed"); - while ((result = sem_wait(&g_thread_suspend_ack_sem)) != 0) { - if (result != EINTR) { + while (sem_wait(&g_thread_suspend_ack_sem) != 0) { + if (errno != EINTR) fail("sem_wait failed"); - } } } static void CollectGarbage(pthread_t thread) { StopWorld(thread); // Walk stacks - StartWorld(thread); + process_sleep(1); + StartWorld(thread); } static void Init() { @@ -118,9 +117,11 @@ void* BusyThread(void *arg) { int main(int argc, const char *argv[]) { Init(); pthread_t busy_thread; - pthread_create(&busy_thread, NULL, &BusyThread, NULL); + if (pthread_create(&busy_thread, NULL, &BusyThread, NULL) != 0) + fail("pthread_create failed"); CollectGarbage(busy_thread); - pthread_join(busy_thread, 0); + if (pthread_join(busy_thread, 0) != 0) + fail("pthread_join failed"); fprintf(stderr, "DONE\n"); return 0; } -- 2.7.4