From e586389ae99929c7cdb7b8dfbb159a2cb2e79909 Mon Sep 17 00:00:00 2001 From: capitalistspz Date: Wed, 15 Apr 2026 01:46:14 +0100 Subject: [PATCH] Use `OSMutex` --- src/Cafe/OS/common/OSUtil.h | 11 +++++++++++ src/Cafe/OS/libs/camera/camera.cpp | 16 +++++++--------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/Cafe/OS/common/OSUtil.h b/src/Cafe/OS/common/OSUtil.h index 31784882..6f0e9449 100644 --- a/src/Cafe/OS/common/OSUtil.h +++ b/src/Cafe/OS/common/OSUtil.h @@ -242,3 +242,14 @@ MPTR makeCallableExport() } void osLib_addVirtualPointer(const char* libraryName, const char* functionName, uint32 vPtr); + +class CafeLockGuard +{ +public: + explicit CafeLockGuard(coreinit::OSMutex* mutex) : m_mutex(mutex) { coreinit::OSLockMutex(m_mutex); } + ~CafeLockGuard() { coreinit::OSUnlockMutex(m_mutex); } + CafeLockGuard(const CafeLockGuard&) = delete; + CafeLockGuard& operator=(const CafeLockGuard&) = delete; +private: + coreinit::OSMutex* m_mutex; +}; diff --git a/src/Cafe/OS/libs/camera/camera.cpp b/src/Cafe/OS/libs/camera/camera.cpp index d3618f12..db5e47d9 100644 --- a/src/Cafe/OS/libs/camera/camera.cpp +++ b/src/Cafe/OS/libs/camera/camera.cpp @@ -7,6 +7,7 @@ #include "Cafe/HW/Espresso/PPCCallback.h" #include "camera/CameraManager.h" #include "Common/CafeString.h" +#include "OS/common/OSUtil.h" #include "util/helpers/ringbuffer.h" namespace camera @@ -97,7 +98,6 @@ namespace camera struct { - std::recursive_mutex mutex{}; bool initialized = false; std::atomic_bool isOpen = false; std::atomic_bool isExiting = false; @@ -106,7 +106,7 @@ namespace camera RingBuffer, 20> inTargetBuffers{}; RingBuffer, 20> outTargetBuffers{}; } s_instance; - + SysAllocator s_cameraMutex; SysAllocator s_cameraEventData; SysAllocator s_cameraWorkerThread; SysAllocator s_cameraWorkerThreadStack; @@ -169,7 +169,7 @@ namespace camera sint32 CAMInit(uint32 cameraId, const CAMInitInfo_t* initInfo, betype* error) { *error = CAM_STATUS_SUCCESS; - std::scoped_lock lock(s_instance.mutex); + CafeLockGuard lock(s_cameraMutex); if (s_instance.initialized) { *error = CAM_STATUS_DEVICE_IN_USE; @@ -212,12 +212,10 @@ namespace camera { if (camHandle != CAM_HANDLE) return CAM_STATUS_INVALID_HANDLE; - { - std::scoped_lock lock(s_instance.mutex); + CafeLockGuard lock(s_cameraMutex); if (!s_instance.initialized || !s_instance.isOpen) return CAM_STATUS_UNINITIALIZED; s_instance.isOpen = false; - } CameraManager::Close(); return CAM_STATUS_SUCCESS; } @@ -226,7 +224,7 @@ namespace camera { if (camHandle != CAM_HANDLE) return CAM_STATUS_INVALID_HANDLE; - auto lock = std::scoped_lock(s_instance.mutex); + CafeLockGuard lock(s_cameraMutex); if (!s_instance.initialized) return CAM_STATUS_UNINITIALIZED; if (s_instance.isOpen) @@ -246,7 +244,7 @@ namespace camera if (!targetSurface || targetSurface->data.IsNull() || targetSurface->size < 1) return CAM_STATUS_INVALID_ARG; cemu_assert_debug(targetSurface->size >= CameraManager::CAMERA_NV12_BUFFER_SIZE); - auto lock = std::scoped_lock(s_instance.mutex); + CafeLockGuard lock(s_cameraMutex); if (!s_instance.initialized) return CAM_STATUS_UNINITIALIZED; if (!s_instance.inTargetBuffers.Push(targetSurface->data)) @@ -258,7 +256,7 @@ namespace camera { if (camHandle != CAM_HANDLE) return; - std::scoped_lock lock(s_instance.mutex); + CafeLockGuard lock(s_cameraMutex); if (!s_instance.initialized) return; s_instance.isExiting = true;