Home | History | Annotate | Download | only in src
      1 //===----------------------------- Registers.hpp --------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //
      9 // Abstract interface to shared reader/writer log, hiding platform and
     10 // configuration differences.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef __RWMUTEX_HPP__
     15 #define __RWMUTEX_HPP__
     16 
     17 #if defined(_WIN32)
     18 #include <windows.h>
     19 #elif !defined(_LIBUNWIND_HAS_NO_THREADS)
     20 #include <pthread.h>
     21 #endif
     22 
     23 namespace libunwind {
     24 
     25 #if defined(_LIBUNWIND_HAS_NO_THREADS)
     26 
     27 class _LIBUNWIND_HIDDEN RWMutex {
     28 public:
     29   bool lock_shared() { return true; }
     30   bool unlock_shared() { return true; }
     31   bool lock() { return true; }
     32   bool unlock() { return true; }
     33 };
     34 
     35 #elif defined(_WIN32)
     36 
     37 class _LIBUNWIND_HIDDEN RWMutex {
     38 public:
     39   bool lock_shared() {
     40     AcquireSRWLockShared(&_lock);
     41     return true;
     42   }
     43   bool unlock_shared() {
     44     ReleaseSRWLockShared(&_lock);
     45     return true;
     46   }
     47   bool lock() {
     48     AcquireSRWLockExclusive(&_lock);
     49     return true;
     50   }
     51   bool unlock() {
     52     ReleaseSRWLockExclusive(&_lock);
     53     return true;
     54   }
     55 
     56 private:
     57   SRWLOCK _lock = SRWLOCK_INIT;
     58 };
     59 
     60 #else
     61 
     62 class _LIBUNWIND_HIDDEN RWMutex {
     63 public:
     64   bool lock_shared() { return pthread_rwlock_rdlock(&_lock) == 0; }
     65   bool unlock_shared() { return pthread_rwlock_unlock(&_lock) == 0; }
     66   bool lock() { return pthread_rwlock_wrlock(&_lock) == 0; }
     67   bool unlock() { return pthread_rwlock_unlock(&_lock) == 0; }
     68 
     69 private:
     70   pthread_rwlock_t _lock = PTHREAD_RWLOCK_INITIALIZER;
     71 };
     72 
     73 #endif
     74 
     75 } // namespace libunwind
     76 
     77 #endif // __RWMUTEX_HPP__
     78