112339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo//===----------------------------- Registers.hpp --------------------------===//
212339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo//
312339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo//                     The LLVM Compiler Infrastructure
412339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo//
512339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo// This file is dual licensed under the MIT and the University of Illinois Open
612339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo// Source Licenses. See LICENSE.TXT for details.
712339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo//
812339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo//
912339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo// Abstract interface to shared reader/writer log, hiding platform and
1012339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo// configuration differences.
1112339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo//
1212339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo//===----------------------------------------------------------------------===//
1312339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
1412339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#ifndef __RWMUTEX_HPP__
1512339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#define __RWMUTEX_HPP__
1612339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
1712339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#if defined(_WIN32)
1812339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#include <windows.h>
1912339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#elif !defined(_LIBUNWIND_HAS_NO_THREADS)
2012339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#include <pthread.h>
2112339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#endif
2212339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
2312339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjonamespace libunwind {
2412339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
2512339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#if defined(_LIBUNWIND_HAS_NO_THREADS)
2612339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
2712339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjoclass _LIBUNWIND_HIDDEN RWMutex {
2812339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjopublic:
2912339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool lock_shared() { return true; }
3012339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool unlock_shared() { return true; }
3112339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool lock() { return true; }
3212339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool unlock() { return true; }
3312339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo};
3412339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
3512339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#elif defined(_WIN32)
3612339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
3712339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjoclass _LIBUNWIND_HIDDEN RWMutex {
3812339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjopublic:
3912339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool lock_shared() {
4012339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo    AcquireSRWLockShared(&_lock);
4112339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo    return true;
4212339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  }
4312339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool unlock_shared() {
4412339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo    ReleaseSRWLockShared(&_lock);
4512339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo    return true;
4612339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  }
4712339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool lock() {
4812339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo    AcquireSRWLockExclusive(&_lock);
4912339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo    return true;
5012339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  }
5112339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool unlock() {
5212339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo    ReleaseSRWLockExclusive(&_lock);
5312339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo    return true;
5412339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  }
5512339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
5612339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjoprivate:
5712339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  SRWLOCK _lock = SRWLOCK_INIT;
5812339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo};
5912339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
6012339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#else
6112339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
6212339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjoclass _LIBUNWIND_HIDDEN RWMutex {
6312339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjopublic:
6412339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool lock_shared() { return pthread_rwlock_rdlock(&_lock) == 0; }
6512339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool unlock_shared() { return pthread_rwlock_unlock(&_lock) == 0; }
6612339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool lock() { return pthread_rwlock_wrlock(&_lock) == 0; }
6712339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  bool unlock() { return pthread_rwlock_unlock(&_lock) == 0; }
6812339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
6912339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjoprivate:
7012339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo  pthread_rwlock_t _lock = PTHREAD_RWLOCK_INITIALIZER;
7112339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo};
7212339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
7312339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#endif
7412339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
7512339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo} // namespace libunwind
7612339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo
7712339e4916d3d1c42feea87a95ecbdfcdbbbc8adMartin Storsjo#endif // __RWMUTEX_HPP__
78