1 | //===-- sanitizer_stoptheworld_testlib.cpp --------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // Dynamic library to test StopTheWorld functionality. |
9 | // When loaded with LD_PRELOAD, it will periodically suspend all threads. |
10 | //===----------------------------------------------------------------------===// |
11 | /* Usage: |
12 | clang++ -fno-exceptions -g -fPIC -I. \ |
13 | sanitizer_common/tests/sanitizer_stoptheworld_testlib.cpp \ |
14 | sanitizer_common/sanitizer_*.cpp -shared -lpthread -o teststoptheworld.so |
15 | LD_PRELOAD=`pwd`/teststoptheworld.so /your/app |
16 | */ |
17 | |
18 | #include "sanitizer_common/sanitizer_platform.h" |
19 | #if SANITIZER_LINUX |
20 | |
21 | #include <dlfcn.h> |
22 | #include <stddef.h> |
23 | #include <stdio.h> |
24 | #include <pthread.h> |
25 | #include <unistd.h> |
26 | |
27 | #include "sanitizer_common/sanitizer_stoptheworld.h" |
28 | |
29 | namespace { |
30 | const uptr kSuspendDuration = 3; |
31 | const uptr kRunDuration = 3; |
32 | |
33 | void Callback(const SuspendedThreadsList &suspended_threads_list, |
34 | void *argument) { |
35 | sleep(seconds: kSuspendDuration); |
36 | } |
37 | |
38 | void *SuspenderThread(void *argument) { |
39 | while (true) { |
40 | sleep(seconds: kRunDuration); |
41 | StopTheWorld(callback: Callback, NULL); |
42 | } |
43 | return NULL; |
44 | } |
45 | |
46 | __attribute__((constructor)) void StopTheWorldTestLibConstructor(void) { |
47 | pthread_t thread_id; |
48 | pthread_create(newthread: &thread_id, NULL, start_routine: SuspenderThread, NULL); |
49 | } |
50 | } // namespace |
51 | |
52 | #endif // SANITIZER_LINUX |
53 | |