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 19 namespace __sanitizer { 20 21 enum 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. 29 class 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 51 typedef 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. 60 void StopTheWorld(StopTheWorldCallback callback, void *argument); 61 62 } // namespace __sanitizer 63 64 #endif // SANITIZER_STOPTHEWORLD_H 65