1435933ddSDimitry Andric //===-- ProcessRunLock.cpp --------------------------------------*- C++ -*-===//
2435933ddSDimitry Andric //
3435933ddSDimitry Andric //                     The LLVM Compiler Infrastructure
4435933ddSDimitry Andric //
5435933ddSDimitry Andric // This file is distributed under the University of Illinois Open Source
6435933ddSDimitry Andric // License. See LICENSE.TXT for details.
7435933ddSDimitry Andric //
8435933ddSDimitry Andric //===----------------------------------------------------------------------===//
935617911SEd Maste 
10435933ddSDimitry Andric #ifndef _WIN32
1135617911SEd Maste #include "lldb/Host/ProcessRunLock.h"
1235617911SEd Maste 
1335617911SEd Maste namespace lldb_private {
1435617911SEd Maste 
ProcessRunLock()15435933ddSDimitry Andric ProcessRunLock::ProcessRunLock() : m_running(false) {
16435933ddSDimitry Andric   int err = ::pthread_rwlock_init(&m_rwlock, NULL);
17435933ddSDimitry Andric   (void)err;
1835617911SEd Maste   //#if LLDB_CONFIGURATION_DEBUG
1935617911SEd Maste   //        assert(err == 0);
2035617911SEd Maste   //#endif
2135617911SEd Maste }
2235617911SEd Maste 
~ProcessRunLock()23435933ddSDimitry Andric ProcessRunLock::~ProcessRunLock() {
24435933ddSDimitry Andric   int err = ::pthread_rwlock_destroy(&m_rwlock);
25435933ddSDimitry Andric   (void)err;
2635617911SEd Maste   //#if LLDB_CONFIGURATION_DEBUG
2735617911SEd Maste   //        assert(err == 0);
2835617911SEd Maste   //#endif
2935617911SEd Maste }
3035617911SEd Maste 
ReadTryLock()31435933ddSDimitry Andric bool ProcessRunLock::ReadTryLock() {
3235617911SEd Maste   ::pthread_rwlock_rdlock(&m_rwlock);
33*b5893f02SDimitry Andric   if (!m_running) {
3435617911SEd Maste     return true;
3535617911SEd Maste   }
3635617911SEd Maste   ::pthread_rwlock_unlock(&m_rwlock);
3735617911SEd Maste   return false;
3835617911SEd Maste }
3935617911SEd Maste 
ReadUnlock()40435933ddSDimitry Andric bool ProcessRunLock::ReadUnlock() {
4135617911SEd Maste   return ::pthread_rwlock_unlock(&m_rwlock) == 0;
4235617911SEd Maste }
4335617911SEd Maste 
SetRunning()44435933ddSDimitry Andric bool ProcessRunLock::SetRunning() {
4535617911SEd Maste   ::pthread_rwlock_wrlock(&m_rwlock);
4635617911SEd Maste   m_running = true;
4735617911SEd Maste   ::pthread_rwlock_unlock(&m_rwlock);
4835617911SEd Maste   return true;
4935617911SEd Maste }
5035617911SEd Maste 
TrySetRunning()51435933ddSDimitry Andric bool ProcessRunLock::TrySetRunning() {
5235617911SEd Maste   bool r;
5335617911SEd Maste 
54435933ddSDimitry Andric   if (::pthread_rwlock_trywrlock(&m_rwlock) == 0) {
5535617911SEd Maste     r = !m_running;
5635617911SEd Maste     m_running = true;
5735617911SEd Maste     ::pthread_rwlock_unlock(&m_rwlock);
5835617911SEd Maste     return r;
5935617911SEd Maste   }
6035617911SEd Maste   return false;
6135617911SEd Maste }
6235617911SEd Maste 
SetStopped()63435933ddSDimitry Andric bool ProcessRunLock::SetStopped() {
6435617911SEd Maste   ::pthread_rwlock_wrlock(&m_rwlock);
6535617911SEd Maste   m_running = false;
6635617911SEd Maste   ::pthread_rwlock_unlock(&m_rwlock);
6735617911SEd Maste   return true;
6835617911SEd Maste }
6935617911SEd Maste }
7035617911SEd Maste 
7135617911SEd Maste #endif
72