Home | History | Annotate | Download | only in sanitizer_common
      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:
     27   SuspendedThreadsList()
     28     : thread_ids_(1024) {}
     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();
     36   uptr thread_count() const { return thread_ids_.size(); }
     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   }
     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