forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			107 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include "lldb/Host/ProcessRunLock.h"
 | |
| #include "lldb/Host/windows/windows.h"
 | |
| 
 | |
| namespace
 | |
| {
 | |
| #if defined(__MINGW32__)
 | |
| // Taken from WinNT.h
 | |
| typedef struct _RTL_SRWLOCK {
 | |
|     PVOID Ptr;
 | |
| } RTL_SRWLOCK, *PRTL_SRWLOCK;
 | |
| 
 | |
| // Taken from WinBase.h
 | |
| typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK;
 | |
| #endif
 | |
| }
 | |
| 
 | |
| 
 | |
| static PSRWLOCK GetLock(lldb::rwlock_t lock)
 | |
| {
 | |
|     return static_cast<PSRWLOCK>(lock);
 | |
| }
 | |
| 
 | |
| static bool ReadLock(lldb::rwlock_t rwlock)
 | |
| {
 | |
|     ::AcquireSRWLockShared(GetLock(rwlock));
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| static bool ReadUnlock(lldb::rwlock_t rwlock)
 | |
| {
 | |
|     ::ReleaseSRWLockShared(GetLock(rwlock));
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| static bool WriteLock(lldb::rwlock_t rwlock)
 | |
| {
 | |
|     ::AcquireSRWLockExclusive(GetLock(rwlock));
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| static bool WriteTryLock(lldb::rwlock_t rwlock)
 | |
| {
 | |
|     return !!::TryAcquireSRWLockExclusive(GetLock(rwlock));
 | |
| }
 | |
| 
 | |
| static bool WriteUnlock(lldb::rwlock_t rwlock)
 | |
| {
 | |
|     ::ReleaseSRWLockExclusive(GetLock(rwlock));
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| using namespace lldb_private;
 | |
| 
 | |
| ProcessRunLock::ProcessRunLock()
 | |
|     : m_running(false)
 | |
| {
 | |
|     m_rwlock = new SRWLOCK;
 | |
|     InitializeSRWLock(GetLock(m_rwlock));
 | |
| }
 | |
| 
 | |
| ProcessRunLock::~ProcessRunLock()
 | |
| {
 | |
|     delete m_rwlock;
 | |
| }
 | |
| 
 | |
| bool ProcessRunLock::ReadTryLock()
 | |
| {
 | |
|     ::ReadLock(m_rwlock);
 | |
|     if (m_running == false)
 | |
|         return true;
 | |
|     ::ReadUnlock(m_rwlock);
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool ProcessRunLock::ReadUnlock()
 | |
| {
 | |
|     return ::ReadUnlock(m_rwlock);
 | |
| }
 | |
| 
 | |
| bool ProcessRunLock::SetRunning ()
 | |
| {
 | |
|     WriteLock(m_rwlock);
 | |
|     m_running = true;
 | |
|     WriteUnlock(m_rwlock);
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| bool ProcessRunLock::TrySetRunning ()
 | |
| {
 | |
|     if (WriteTryLock(m_rwlock))
 | |
|     {
 | |
|         bool was_running = m_running;
 | |
|         m_running = true;
 | |
|         WriteUnlock(m_rwlock);
 | |
|         return !was_running;
 | |
|     }
 | |
|     return false;
 | |
| }
 | |
| 
 | |
| bool ProcessRunLock::SetStopped ()
 | |
| {
 | |
|     WriteLock(m_rwlock);
 | |
|     m_running = false;
 | |
|     WriteUnlock(m_rwlock);
 | |
|     return true;
 | |
| }
 |