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. GetRegistersAndSP(uptr index,InternalMmapVector<uptr> * buffer,uptr * sp)35 virtual PtraceRegistersStatus GetRegistersAndSP( 36 uptr index, InternalMmapVector<uptr> *buffer, uptr *sp) const { 37 UNIMPLEMENTED(); 38 } 39 ThreadCount()40 virtual uptr ThreadCount() const { UNIMPLEMENTED(); } GetThreadID(uptr index)41 virtual tid_t GetThreadID(uptr index) const { UNIMPLEMENTED(); } 42 43 protected: ~SuspendedThreadsList()44 ~SuspendedThreadsList() {} 45 46 private: 47 // Prohibit copy and assign. 48 SuspendedThreadsList(const SuspendedThreadsList &) = delete; 49 void operator=(const SuspendedThreadsList &) = delete; 50 }; 51 52 typedef 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. 61 void StopTheWorld(StopTheWorldCallback callback, void *argument); 62 63 } // namespace __sanitizer 64 65 #endif // SANITIZER_STOPTHEWORLD_H 66