// SPDX-FileCopyrightText: Copyright 2025 shadPS4 Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include namespace Common { // Like std::shared_mutex, but reader has priority over writer. class SharedFirstMutex { public: void lock() { std::unique_lock lock(mtx); cv.wait(lock, [this]() { return !writer_active && readers == 0; }); writer_active = true; } void unlock() { std::lock_guard lock(mtx); writer_active = false; cv.notify_all(); } void lock_shared() { std::unique_lock lock(mtx); cv.wait(lock, [this]() { return !writer_active; }); ++readers; } void unlock_shared() { std::lock_guard lock(mtx); if (--readers == 0) { cv.notify_all(); } } private: std::mutex mtx; std::condition_variable cv; int readers = 0; bool writer_active = false; }; } // namespace Common