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(uptr index, uptr *buffer, 36 uptr *sp) const { 37 UNIMPLEMENTED(); 38 } 39 40 // The buffer in GetRegistersAndSP should be at least this big. 41 virtual uptr RegisterCount() const { UNIMPLEMENTED(); } 42 virtual uptr ThreadCount() const { UNIMPLEMENTED(); } 43 virtual tid_t GetThreadID(uptr index) const { UNIMPLEMENTED(); } 44 45 private: 46 // Prohibit copy and assign. 47 SuspendedThreadsList(const SuspendedThreadsList&); 48 void operator=(const SuspendedThreadsList&); 49}; 50 51typedef void (*StopTheWorldCallback)( 52 const SuspendedThreadsList &suspended_threads_list, 53 void *argument); 54 55// Suspend all threads in the current process and run the callback on the list 56// of suspended threads. This function will resume the threads before returning. 57// The callback should not call any libc functions. The callback must not call 58// exit() nor _exit() and instead return to the caller. 59// This function should NOT be called from multiple threads simultaneously. 60void StopTheWorld(StopTheWorldCallback callback, void *argument); 61 62} // namespace __sanitizer 63 64#endif // SANITIZER_STOPTHEWORLD_H 65