//===----------------------------- 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(_WIN32) #include #elif !defined(_LIBUNWIND_HAS_NO_THREADS) #include #endif namespace libunwind { #if 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__