| //===----------------------------- Registers.hpp --------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is dual licensed under the MIT and the University of Illinois Open |
| // Source Licenses. See LICENSE.TXT for details. |
| // |
| // |
| // Abstract interface to shared reader/writer log, hiding platform and |
| // configuration differences. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef __RWMUTEX_HPP__ |
| #define __RWMUTEX_HPP__ |
| |
| #if defined(_LIBUNWIND_HAS_STARBOARD_THREADS) |
| #include "starboard/common/rwlock.h" |
| #elif defined(_WIN32) |
| #include <windows.h> |
| #elif !defined(_LIBUNWIND_HAS_NO_THREADS) |
| #include <pthread.h> |
| #endif |
| |
| namespace libunwind { |
| |
| #if defined(_LIBUNWIND_HAS_STARBOARD_THREADS) |
| |
| // RWMutex implements a readers-writer mutex on top of the core Starboard |
| // interface. |
| class _LIBUNWIND_HIDDEN RWMutex { |
| public: |
| RWMutex() = default; |
| ~RWMutex() = default; |
| |
| bool lock_shared() { |
| _lock.AcquireReadLock(); |
| return true; |
| } |
| |
| bool unlock_shared() { |
| _lock.ReleaseReadLock(); |
| return true; |
| } |
| |
| bool lock() { |
| _lock.AcquireWriteLock(); |
| return true; |
| } |
| |
| bool unlock() { |
| _lock.ReleaseWriteLock(); |
| return true; |
| } |
| |
| private: |
| starboard::RWLock _lock; |
| }; |
| |
| #elif defined(_LIBUNWIND_HAS_NO_THREADS) |
| |
| class _LIBUNWIND_HIDDEN RWMutex { |
| public: |
| bool lock_shared() { return true; } |
| bool unlock_shared() { return true; } |
| bool lock() { return true; } |
| bool unlock() { return true; } |
| }; |
| |
| #elif defined(_WIN32) |
| |
| class _LIBUNWIND_HIDDEN RWMutex { |
| public: |
| bool lock_shared() { |
| AcquireSRWLockShared(&_lock); |
| return true; |
| } |
| bool unlock_shared() { |
| ReleaseSRWLockShared(&_lock); |
| return true; |
| } |
| bool lock() { |
| AcquireSRWLockExclusive(&_lock); |
| return true; |
| } |
| bool unlock() { |
| ReleaseSRWLockExclusive(&_lock); |
| return true; |
| } |
| |
| private: |
| SRWLOCK _lock = SRWLOCK_INIT; |
| }; |
| |
| #else |
| |
| class _LIBUNWIND_HIDDEN RWMutex { |
| public: |
| bool lock_shared() { return pthread_rwlock_rdlock(&_lock) == 0; } |
| bool unlock_shared() { return pthread_rwlock_unlock(&_lock) == 0; } |
| bool lock() { return pthread_rwlock_wrlock(&_lock) == 0; } |
| bool unlock() { return pthread_rwlock_unlock(&_lock) == 0; } |
| |
| private: |
| pthread_rwlock_t _lock = PTHREAD_RWLOCK_INITIALIZER; |
| }; |
| |
| #endif |
| |
| } // namespace libunwind |
| |
| #endif // __RWMUTEX_HPP__ |