| //===-- sanitizer_stoptheworld_testlib.cc ---------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // Dynamic library to test StopTheWorld functionality. |
| // When loaded with LD_PRELOAD, it will periodically suspend all threads. |
| //===----------------------------------------------------------------------===// |
| /* Usage: |
| clang++ -fno-exceptions -g -fPIC -I. \ |
| sanitizer_common/tests/sanitizer_stoptheworld_testlib.cc \ |
| sanitizer_common/sanitizer_*.cc -shared -lpthread -o teststoptheworld.so |
| LD_PRELOAD=`pwd`/teststoptheworld.so /your/app |
| */ |
| |
| #include "sanitizer_common/sanitizer_platform.h" |
| #if SANITIZER_LINUX |
| |
| #include <dlfcn.h> |
| #include <stddef.h> |
| #include <stdio.h> |
| #include <pthread.h> |
| #include <unistd.h> |
| |
| #include "sanitizer_common/sanitizer_stoptheworld.h" |
| |
| namespace { |
| const uptr kSuspendDuration = 3; |
| const uptr kRunDuration = 3; |
| |
| void Callback(const SuspendedThreadsList &suspended_threads_list, |
| void *argument) { |
| sleep(kSuspendDuration); |
| } |
| |
| void *SuspenderThread(void *argument) { |
| while (true) { |
| sleep(kRunDuration); |
| StopTheWorld(Callback, NULL); |
| } |
| return NULL; |
| } |
| |
| __attribute__((constructor)) void StopTheWorldTestLibConstructor(void) { |
| pthread_t thread_id; |
| pthread_create(&thread_id, NULL, SuspenderThread, NULL); |
| } |
| } // namespace |
| |
| #endif // SANITIZER_LINUX |