diff options
Diffstat (limited to 'source/Host/common/ProcessRunLock.cpp')
| -rw-r--r-- | source/Host/common/ProcessRunLock.cpp | 71 | 
1 files changed, 71 insertions, 0 deletions
diff --git a/source/Host/common/ProcessRunLock.cpp b/source/Host/common/ProcessRunLock.cpp new file mode 100644 index 000000000000..669a96ddd70c --- /dev/null +++ b/source/Host/common/ProcessRunLock.cpp @@ -0,0 +1,71 @@ +#ifndef _WIN32 + +#include "lldb/Host/ProcessRunLock.h" + +namespace lldb_private { + +    ProcessRunLock::ProcessRunLock() +        : m_running(false) +    { +        int err = ::pthread_rwlock_init(&m_rwlock, NULL); (void) err; +        //#if LLDB_CONFIGURATION_DEBUG +        //        assert(err == 0); +        //#endif +    } + +    ProcessRunLock::~ProcessRunLock() +    { +        int err = ::pthread_rwlock_destroy(&m_rwlock); (void) err; +        //#if LLDB_CONFIGURATION_DEBUG +        //        assert(err == 0); +        //#endif +    } + +    bool ProcessRunLock::ReadTryLock() +    { +        ::pthread_rwlock_rdlock(&m_rwlock); +        if (m_running == false) +        { +            return true; +        } +        ::pthread_rwlock_unlock(&m_rwlock); +        return false; +    } + +    bool ProcessRunLock::ReadUnlock() +    { +        return ::pthread_rwlock_unlock(&m_rwlock) == 0; +    } + +    bool ProcessRunLock::SetRunning() +    { +        ::pthread_rwlock_wrlock(&m_rwlock); +        m_running = true; +        ::pthread_rwlock_unlock(&m_rwlock); +        return true; +    } + +    bool ProcessRunLock::TrySetRunning() +    { +        bool r; + +        if (::pthread_rwlock_trywrlock(&m_rwlock) == 0) +        { +            r = !m_running; +            m_running = true; +            ::pthread_rwlock_unlock(&m_rwlock); +            return r; +        } +        return false; +    } + +    bool ProcessRunLock::SetStopped() +    { +        ::pthread_rwlock_wrlock(&m_rwlock); +        m_running = false; +        ::pthread_rwlock_unlock(&m_rwlock); +        return true; +    } +} + +#endif  | 
