1 //===-- sanitizer_stoptheworld.h --------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Defines the StopTheWorld function which suspends the execution of the current
11 // process and runs the user-supplied callback in the same address space.
12 //
13 //===----------------------------------------------------------------------===//
14 #ifndef SANITIZER_STOPTHEWORLD_H
15 #define SANITIZER_STOPTHEWORLD_H
16 
17 #include "sanitizer_internal_defs.h"
18 #include "sanitizer_common.h"
19 
20 namespace __sanitizer {
21 typedef int SuspendedThreadID;
22 
23 // Holds the list of suspended threads and provides an interface to dump their
24 // register contexts.
25 class SuspendedThreadsList {
26  public:
SuspendedThreadsList()27   SuspendedThreadsList()
28     : thread_ids_(1024) {}
GetThreadID(uptr index)29   SuspendedThreadID GetThreadID(uptr index) const {
30     CHECK_LT(index, thread_ids_.size());
31     return thread_ids_[index];
32   }
33   int GetRegistersAndSP(uptr index, uptr *buffer, uptr *sp) const;
34   // The buffer in GetRegistersAndSP should be at least this big.
35   static uptr RegisterCount();
thread_count()36   uptr thread_count() const { return thread_ids_.size(); }
Contains(SuspendedThreadID thread_id)37   bool Contains(SuspendedThreadID thread_id) const {
38     for (uptr i = 0; i < thread_ids_.size(); i++) {
39       if (thread_ids_[i] == thread_id)
40         return true;
41     }
42     return false;
43   }
Append(SuspendedThreadID thread_id)44   void Append(SuspendedThreadID thread_id) {
45     thread_ids_.push_back(thread_id);
46   }
47 
48  private:
49   InternalMmapVector<SuspendedThreadID> thread_ids_;
50 
51   // Prohibit copy and assign.
52   SuspendedThreadsList(const SuspendedThreadsList&);
53   void operator=(const SuspendedThreadsList&);
54 };
55 
56 typedef void (*StopTheWorldCallback)(
57     const SuspendedThreadsList &suspended_threads_list,
58     void *argument);
59 
60 // Suspend all threads in the current process and run the callback on the list
61 // of suspended threads. This function will resume the threads before returning.
62 // The callback should not call any libc functions. The callback must not call
63 // exit() nor _exit() and instead return to the caller.
64 // This function should NOT be called from multiple threads simultaneously.
65 void StopTheWorld(StopTheWorldCallback callback, void *argument);
66 
67 }  // namespace __sanitizer
68 
69 #endif  // SANITIZER_STOPTHEWORLD_H
70