1//===-- sanitizer_stoptheworld.h --------------------------------*- C++ -*-===// 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// 9// Defines the StopTheWorld function which suspends the execution of the current 10// process and runs the user-supplied callback in the same address space. 11// 12//===----------------------------------------------------------------------===// 13#ifndef SANITIZER_STOPTHEWORLD_H 14#define SANITIZER_STOPTHEWORLD_H 15 16#include "sanitizer_internal_defs.h" 17#include "sanitizer_common.h" 18 19namespace __sanitizer { 20 21enum PtraceRegistersStatus { 22 REGISTERS_UNAVAILABLE_FATAL = -1, 23 REGISTERS_UNAVAILABLE = 0, 24 REGISTERS_AVAILABLE = 1 25}; 26 27// Holds the list of suspended threads and provides an interface to dump their 28// register contexts. 29class SuspendedThreadsList { 30 public: 31 SuspendedThreadsList() = default; 32 33 // Can't declare pure virtual functions in sanitizer runtimes: 34 // __cxa_pure_virtual might be unavailable. Use UNIMPLEMENTED() instead. 35 virtual PtraceRegistersStatus GetRegistersAndSP( 36 uptr index, InternalMmapVector<uptr> *buffer, uptr *sp) const { 37 UNIMPLEMENTED(); 38 } 39 40 virtual uptr ThreadCount() const { UNIMPLEMENTED(); } 41 virtual tid_t GetThreadID(uptr index) const { UNIMPLEMENTED(); } 42 43 protected: 44 ~SuspendedThreadsList() {} 45 46 private: 47 // Prohibit copy and assign. 48 SuspendedThreadsList(const SuspendedThreadsList &) = delete; 49 void operator=(const SuspendedThreadsList &) = delete; 50}; 51 52typedef void (*StopTheWorldCallback)( 53 const SuspendedThreadsList &suspended_threads_list, 54 void *argument); 55 56// Suspend all threads in the current process and run the callback on the list 57// of suspended threads. This function will resume the threads before returning. 58// The callback should not call any libc functions. The callback must not call 59// exit() nor _exit() and instead return to the caller. 60// This function should NOT be called from multiple threads simultaneously. 61void StopTheWorld(StopTheWorldCallback callback, void *argument); 62 63} // namespace __sanitizer 64 65#endif // SANITIZER_STOPTHEWORLD_H 66