sanitizer_stoptheworld.h revision 6d036065e2ba85d9ad2a141596693b026f7ebbcc
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
20namespace __sanitizer {
21typedef int SuspendedThreadID;
22
23// Holds the list of suspended threads. Also provides register dumping
24// functionality (to be implemented).
25class SuspendedThreadsList {
26 public:
27  SuspendedThreadsList()
28    : thread_ids_(1024) {}
29  SuspendedThreadID GetThreadID(uptr index) {
30    CHECK_LT(index, thread_ids_.size());
31    return thread_ids_[index];
32  }
33  void DumpRegisters(uptr index) const {
34    UNIMPLEMENTED();
35  }
36  uptr thread_count() { return thread_ids_.size(); }
37  bool Contains(SuspendedThreadID thread_id) {
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  }
44  void Append(SuspendedThreadID thread_id) {
45    thread_ids_.push_back(thread_id);
46  }
47
48 private:
49  InternalVector<SuspendedThreadID> thread_ids_;
50
51  // Prohibit copy and assign.
52  SuspendedThreadsList(const SuspendedThreadsList&);
53  void operator=(const SuspendedThreadsList&);
54};
55
56typedef 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.
63// This function should NOT be called from multiple threads simultaneously.
64void StopTheWorld(StopTheWorldCallback callback, void *argument);
65
66}  // namespace __sanitizer
67
68#endif  // SANITIZER_STOPTHEWORLD_H
69