From e1e7fb745e500386c34eff223b45467db4bb78d2 Mon Sep 17 00:00:00 2001 From: Nikita Smith Date: Mon, 20 Jan 2025 21:36:34 -0800 Subject: [PATCH] win32 shared mutex impl and linux stubs --- src/os/core/linux/os_core_linux.c | 26 +++++++++++++++++++++++ src/os/core/os_core.h | 6 ++++++ src/os/core/win32/os_core_win32.c | 34 +++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/src/os/core/linux/os_core_linux.c b/src/os/core/linux/os_core_linux.c index 3b2c73b1..31d2b252 100644 --- a/src/os/core/linux/os_core_linux.c +++ b/src/os/core/linux/os_core_linux.c @@ -861,6 +861,32 @@ os_mutex_drop(OS_Handle mutex) pthread_mutex_unlock(&entity->mutex_handle); } +internal OS_Handle +os_shared_mutex_alloc(String8 name) +{ + NotImplemented; + OS_Handle handle = {0}; + return handle; +} + +internal void +os_shared_mutex_release(OS_Handle mutex) +{ + NotImplemented; +} + +internal B32 +os_shared_mutex_take(OS_Handle mutex, U64 endt_us) +{ + NotImplemented; +} + +internal void +os_shared_mutex_drop(OS_Handle mutex) +{ + NotImplemented; +} + //- rjf: reader/writer mutexes internal OS_Handle diff --git a/src/os/core/os_core.h b/src/os/core/os_core.h index 5f09ca8b..867120ef 100644 --- a/src/os/core/os_core.h +++ b/src/os/core/os_core.h @@ -277,6 +277,12 @@ internal void os_rw_mutex_drop_r(OS_Handle mutex); internal void os_rw_mutex_take_w(OS_Handle mutex); internal void os_rw_mutex_drop_w(OS_Handle mutex); +//- shared mutex +internal OS_Handle os_shared_mutex_alloc(String8 name); +internal void os_shared_mutex_release(OS_Handle mutex); +internal B32 os_shared_mutex_take(OS_Handle mutex, U64 endt_us); +internal void os_shared_mutex_drop(OS_Handle mutex); + //- rjf: condition variables internal OS_Handle os_condition_variable_alloc(void); internal void os_condition_variable_release(OS_Handle cv); diff --git a/src/os/core/win32/os_core_win32.c b/src/os/core/win32/os_core_win32.c index 6a0e0281..e97a203d 100644 --- a/src/os/core/win32/os_core_win32.c +++ b/src/os/core/win32/os_core_win32.c @@ -1106,6 +1106,40 @@ os_mutex_drop(OS_Handle mutex) LeaveCriticalSection(&entity->mutex); } +internal OS_Handle +os_shared_mutex_alloc(String8 name) +{ + Assert(name.size); + Temp scratch = scratch_begin(0,0); + String16 name16 = str16_from_8(scratch.arena, name); + HANDLE handle = CreateMutexW(0, 0, (WCHAR*)name16.str); + Assert(handle != 0); + OS_Handle mutex = {(U64)handle}; + scratch_end(scratch); + return mutex; +} + +internal void +os_shared_mutex_release(OS_Handle mutex) +{ + CloseHandle((HANDLE)mutex.u64[0]); +} + +internal B32 +os_shared_mutex_take(OS_Handle mutex, U64 endt_us) +{ + U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us); + DWORD wait_result = WaitForSingleObject((HANDLE)mutex.u64[0], sleep_ms); + B32 result = (wait_result == WAIT_OBJECT_0); + return result; +} + +internal void +os_shared_mutex_drop(OS_Handle mutex) +{ + ReleaseMutex((HANDLE)mutex.u64[0]); +} + //- rjf: reader/writer mutexes internal OS_Handle