From 9248dcf07ec5c0499e6cc7e7555a746c58130934 Mon Sep 17 00:00:00 2001 From: greg7mdp Date: Sun, 19 Nov 2023 18:14:48 -0500 Subject: [PATCH] Add support for Windows `phmap::srwlock` --- examples/lazy_emplace_l.cc | 11 +---------- parallel_hashmap/phmap_base.h | 37 +++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/examples/lazy_emplace_l.cc b/examples/lazy_emplace_l.cc index beb5f2f..392428f 100644 --- a/examples/lazy_emplace_l.cc +++ b/examples/lazy_emplace_l.cc @@ -8,18 +8,9 @@ #include #include -class srwlock { - SRWLOCK _lock; - -public: - srwlock() { InitializeSRWLock(&_lock); } - void lock() { AcquireSRWLockExclusive(&_lock); } - void unlock() { ReleaseSRWLockExclusive(&_lock); } -}; - using Map = phmap::parallel_flat_hash_map, phmap::priv::hash_default_eq, - std::allocator>, 8, srwlock>; + std::allocator>, 8, phmap::srwlock>; class Dict { diff --git a/parallel_hashmap/phmap_base.h b/parallel_hashmap/phmap_base.h index 89597ab..db4f767 100644 --- a/parallel_hashmap/phmap_base.h +++ b/parallel_hashmap/phmap_base.h @@ -5000,6 +5000,7 @@ public: // -------------------------------------------------------------------------- // Abseil Mutex support (read and write lock support) +// use: `phmap::AbslMutex` instead of `std::mutex` // -------------------------------------------------------------------------- #ifdef ABSL_SYNCHRONIZATION_MUTEX_H_ @@ -5030,6 +5031,42 @@ public: #endif +// -------------------------------------------------------------------------- +// Microsoft SRWLOCK support (read and write lock support) +// use: `phmap::srwlock` instead of `std::mutex` +// -------------------------------------------------------------------------- +#if defined(_MSVC_LANG) && defined(SRWLOCK_INIT) + + class srwlock { + SRWLOCK _lock; + public: + srwlock() { InitializeSRWLock(&_lock); } + void lock() { AcquireSRWLockExclusive(&_lock); } + void unlock() { ReleaseSRWLockExclusive(&_lock); } + bool try_lock() { return !!TryAcquireSRWLockExclusive(&_lock); } + void lock_shared() { AcquireSRWLockShared(&_lock); } + void unlock_shared() { ReleaseSRWLockShared(&_lock); } + bool try_lock_shared() { return !!TryAcquireSRWLockShared(&_lock); } + }; + + + template<> + class LockableImpl : public srwlock + { + public: + using mutex_type = srwlock; + using Base = LockableBaseImpl; + using SharedLock = typename Base::ReadLock; + using ReadWriteLock = typename Base::ReadWriteLock; + using UpgradeLock = typename Base::WriteLock; + using UniqueLock = typename Base::WriteLock; + using SharedLocks = typename Base::ReadLocks; + using UniqueLocks = typename Base::WriteLocks; + using UpgradeToUnique = typename Base::DoNothing; // we already have unique ownership + }; + +#endif + // -------------------------------------------------------------------------- // Boost shared_mutex support (read and write lock support) // --------------------------------------------------------------------------