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:
12clang++ -fno-exceptions -g -fPIC -I. \
13 sanitizer_common/tests/sanitizer_stoptheworld_testlib.cpp \
14 sanitizer_common/sanitizer_*.cpp -shared -lpthread -o teststoptheworld.so
15LD_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
29namespace {
30const uptr kSuspendDuration = 3;
31const uptr kRunDuration = 3;
32
33void Callback(const SuspendedThreadsList &suspended_threads_list,
34 void *argument) {
35 sleep(seconds: kSuspendDuration);
36}
37
38void *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

source code of compiler-rt/lib/sanitizer_common/tests/sanitizer_stoptheworld_testlib.cpp