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