53 lines · cpp
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-exception6//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.so15LD_PRELOAD=`pwd`/teststoptheworld.so /your/app16*/17 18#include "sanitizer_common/sanitizer_platform.h"19#if SANITIZER_LINUX20 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(kSuspendDuration);36}37 38void *SuspenderThread(void *argument) {39 while (true) {40 sleep(kRunDuration);41 StopTheWorld(Callback, NULL);42 }43 return NULL;44}45 46__attribute__((constructor)) void StopTheWorldTestLibConstructor(void) {47 pthread_t thread_id;48 pthread_create(&thread_id, NULL, SuspenderThread, NULL);49}50} // namespace51 52#endif // SANITIZER_LINUX53