| //===-- 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 |