forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- sanitizer_stoptheworld.h --------------------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // Defines the StopTheWorld function which suspends the execution of the current
 | |
| // process and runs the user-supplied callback in the same address space.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| #ifndef SANITIZER_STOPTHEWORLD_H
 | |
| #define SANITIZER_STOPTHEWORLD_H
 | |
| 
 | |
| #include "sanitizer_internal_defs.h"
 | |
| #include "sanitizer_common.h"
 | |
| 
 | |
| namespace __sanitizer {
 | |
| typedef int SuspendedThreadID;
 | |
| 
 | |
| // Holds the list of suspended threads and provides an interface to dump their
 | |
| // register contexts.
 | |
| class SuspendedThreadsList {
 | |
|  public:
 | |
|   SuspendedThreadsList()
 | |
|     : thread_ids_(1024) {}
 | |
|   SuspendedThreadID GetThreadID(uptr index) const {
 | |
|     CHECK_LT(index, thread_ids_.size());
 | |
|     return thread_ids_[index];
 | |
|   }
 | |
|   int GetRegistersAndSP(uptr index, uptr *buffer, uptr *sp) const;
 | |
|   // The buffer in GetRegistersAndSP should be at least this big.
 | |
|   static uptr RegisterCount();
 | |
|   uptr thread_count() const { return thread_ids_.size(); }
 | |
|   bool Contains(SuspendedThreadID thread_id) const {
 | |
|     for (uptr i = 0; i < thread_ids_.size(); i++) {
 | |
|       if (thread_ids_[i] == thread_id)
 | |
|         return true;
 | |
|     }
 | |
|     return false;
 | |
|   }
 | |
|   void Append(SuspendedThreadID thread_id) {
 | |
|     thread_ids_.push_back(thread_id);
 | |
|   }
 | |
| 
 | |
|  private:
 | |
|   InternalMmapVector<SuspendedThreadID> thread_ids_;
 | |
| 
 | |
|   // Prohibit copy and assign.
 | |
|   SuspendedThreadsList(const SuspendedThreadsList&);
 | |
|   void operator=(const SuspendedThreadsList&);
 | |
| };
 | |
| 
 | |
| typedef void (*StopTheWorldCallback)(
 | |
|     const SuspendedThreadsList &suspended_threads_list,
 | |
|     void *argument);
 | |
| 
 | |
| // Suspend all threads in the current process and run the callback on the list
 | |
| // of suspended threads. This function will resume the threads before returning.
 | |
| // The callback should not call any libc functions. The callback must not call
 | |
| // exit() nor _exit() and instead return to the caller.
 | |
| // This function should NOT be called from multiple threads simultaneously.
 | |
| void StopTheWorld(StopTheWorldCallback callback, void *argument);
 | |
| 
 | |
| }  // namespace __sanitizer
 | |
| 
 | |
| #endif  // SANITIZER_STOPTHEWORLD_H
 |