blob: 50a78a57b0896fd027717e17527f2c15ea0f7bc4 [file] [log] [blame]
Martin Storsjo12339e42017-10-23 19:29:36 +00001//===----------------------------- 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
23namespace libunwind {
24
25#if defined(_LIBUNWIND_HAS_NO_THREADS)
26
27class _LIBUNWIND_HIDDEN RWMutex {
28public:
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
37class _LIBUNWIND_HIDDEN RWMutex {
38public:
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
56private:
57 SRWLOCK _lock = SRWLOCK_INIT;
58};
59
60#else
61
62class _LIBUNWIND_HIDDEN RWMutex {
63public:
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
69private:
70 pthread_rwlock_t _lock = PTHREAD_RWLOCK_INITIALIZER;
71};
72
73#endif
74
75} // namespace libunwind
76
77#endif // __RWMUTEX_HPP__