ProcessRunLock.cpp revision 344779
176259Sgreen//===-- ProcessRunLock.cpp --------------------------------------*- C++ -*-===//
276259Sgreen//
392555Sdes//                     The LLVM Compiler Infrastructure
476259Sgreen//
576259Sgreen// This file is distributed under the University of Illinois Open Source
676259Sgreen// License. See LICENSE.TXT for details.
776259Sgreen//
876259Sgreen//===----------------------------------------------------------------------===//
976259Sgreen
1076259Sgreen#ifndef _WIN32
1176259Sgreen#include "lldb/Host/ProcessRunLock.h"
1276259Sgreen
1376259Sgreennamespace lldb_private {
1476259Sgreen
1576259SgreenProcessRunLock::ProcessRunLock() : m_running(false) {
1676259Sgreen  int err = ::pthread_rwlock_init(&m_rwlock, NULL);
1776259Sgreen  (void)err;
1876259Sgreen  //#if LLDB_CONFIGURATION_DEBUG
1976259Sgreen  //        assert(err == 0);
2076259Sgreen  //#endif
2176259Sgreen}
2276259Sgreen
2376259SgreenProcessRunLock::~ProcessRunLock() {
2476259Sgreen  int err = ::pthread_rwlock_destroy(&m_rwlock);
2576259Sgreen  (void)err;
2692555Sdes  //#if LLDB_CONFIGURATION_DEBUG
2776259Sgreen  //        assert(err == 0);
2876259Sgreen  //#endif
2976259Sgreen}
3092555Sdes
3176259Sgreenbool ProcessRunLock::ReadTryLock() {
3276259Sgreen  ::pthread_rwlock_rdlock(&m_rwlock);
3376259Sgreen  if (!m_running) {
3492555Sdes    return true;
3576259Sgreen  }
3676259Sgreen  ::pthread_rwlock_unlock(&m_rwlock);
3792555Sdes  return false;
3892555Sdes}
3992555Sdes
4076259Sgreenbool ProcessRunLock::ReadUnlock() {
4192555Sdes  return ::pthread_rwlock_unlock(&m_rwlock) == 0;
4292555Sdes}
4392555Sdes
4492555Sdesbool ProcessRunLock::SetRunning() {
4592555Sdes  ::pthread_rwlock_wrlock(&m_rwlock);
4692555Sdes  m_running = true;
4792555Sdes  ::pthread_rwlock_unlock(&m_rwlock);
4892555Sdes  return true;
4992555Sdes}
5092555Sdes
5192555Sdesbool ProcessRunLock::TrySetRunning() {
5292555Sdes  bool r;
5392555Sdes
5492555Sdes  if (::pthread_rwlock_trywrlock(&m_rwlock) == 0) {
5592555Sdes    r = !m_running;
5692555Sdes    m_running = true;
5792555Sdes    ::pthread_rwlock_unlock(&m_rwlock);
5892555Sdes    return r;
5992555Sdes  }
6092555Sdes  return false;
6192555Sdes}
6292555Sdes
6392555Sdesbool ProcessRunLock::SetStopped() {
6492555Sdes  ::pthread_rwlock_wrlock(&m_rwlock);
6592555Sdes  m_running = false;
6692555Sdes  ::pthread_rwlock_unlock(&m_rwlock);
6792555Sdes  return true;
6892555Sdes}
6992555Sdes}
7092555Sdes
7192555Sdes#endif
7292555Sdes