From 231f91304a8269a25b5ec06fde30d57dae3a023a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 26 Jun 2020 20:30:33 +0100 Subject: [PATCH] Keep previous behaviour for `sync` but move to `sys/windows` --- core/sync/sync_windows.odin | 53 +++++++++++++++---------------------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/core/sync/sync_windows.odin b/core/sync/sync_windows.odin index 311c2fdcb..18866e9ae 100644 --- a/core/sync/sync_windows.odin +++ b/core/sync/sync_windows.odin @@ -1,20 +1,20 @@ // +build windows package sync -import "core:sys/win32" +import win32 "core:sys/windows" foreign import kernel32 "system:kernel32.lib" // A lock that can only be held by one thread at once. Mutex :: struct { - _critical_section: win32.Critical_Section, + _critical_section: win32.CRITICAL_SECTION, } // Blocks until signalled. // When signalled, awakens exactly one waiting thread. Condition :: struct { - _handle: WIN32_CONDITION_VARIABLE, + _handle: win32.CONDITION_VARIABLE, mutex: ^Mutex, } @@ -22,87 +22,78 @@ Condition :: struct { // When waited upon, blocks until the internal count is greater than zero, then subtracts one. // Posting to the semaphore increases the count by one, or the provided amount. Semaphore :: struct { - _handle: win32.Handle, + _handle: win32.HANDLE, } semaphore_init :: proc(s: ^Semaphore, initial_count := 0) { - s._handle = win32.create_semaphore_w(nil, i32(initial_count), 1<<31-1, nil); + s._handle = win32.CreateSemaphoreW(nil, i32(initial_count), 1<<31-1, nil); } semaphore_destroy :: proc(s: ^Semaphore) { - win32.close_handle(s._handle); + win32.CloseHandle(s._handle); } semaphore_post :: proc(s: ^Semaphore, count := 1) { - win32.release_semaphore(s._handle, i32(count), nil); + win32.ReleaseSemaphore(s._handle, i32(count), nil); } semaphore_wait_for :: proc(s: ^Semaphore) { // NOTE(tetra, 2019-10-30): wait_for_single_object decrements the count before it returns. - result := win32.wait_for_single_object(s._handle, win32.INFINITE); + result := win32.WaitForSingleObject(s._handle, win32.INFINITE); assert(result != win32.WAIT_FAILED); } mutex_init :: proc(m: ^Mutex, spin_count := 0) { - win32.initialize_critical_section_and_spin_count(&m._critical_section, u32(spin_count)); + win32.InitializeCriticalSectionAndSpinCount(&m._critical_section, u32(spin_count)); } mutex_destroy :: proc(m: ^Mutex) { - win32.delete_critical_section(&m._critical_section); + win32.DeleteCriticalSection(&m._critical_section); } mutex_lock :: proc(m: ^Mutex) { - win32.enter_critical_section(&m._critical_section); + win32.EnterCriticalSection(&m._critical_section); } mutex_try_lock :: proc(m: ^Mutex) -> bool { - return bool(win32.try_enter_critical_section(&m._critical_section)); + return bool(win32.TryEnterCriticalSection(&m._critical_section)); } mutex_unlock :: proc(m: ^Mutex) { - win32.leave_critical_section(&m._critical_section); -} - -@private WIN32_CONDITION_VARIABLE :: distinct rawptr; -@private -foreign kernel32 { - InitializeConditionVariable :: proc(ConditionVariable: ^WIN32_CONDITION_VARIABLE) --- - WakeConditionVariable :: proc(ConditionVariable: ^WIN32_CONDITION_VARIABLE) --- - WakeAllConditionVariable :: proc(ConditionVariable: ^WIN32_CONDITION_VARIABLE) --- - SleepConditionVariableCS :: proc(ConditionVariable: ^WIN32_CONDITION_VARIABLE, CriticalSection: ^win32.Critical_Section, dwMilliseconds: u32) -> b32 --- + win32.LeaveCriticalSection(&m._critical_section); } condition_init :: proc(c: ^Condition, mutex: ^Mutex) -> bool { assert(mutex != nil); - InitializeConditionVariable(&c._handle); + win32.InitializeConditionVariable(&c._handle); c.mutex = mutex; - return c._handle != nil; + return true; } condition_destroy :: proc(c: ^Condition) { - if c._handle != nil { - WakeAllConditionVariable(&c._handle); + if c._handle.ptr != nil { + win32.WakeAllConditionVariable(&c._handle); } } condition_signal :: proc(c: ^Condition) -> bool { - if c._handle == nil { + if c._handle.ptr == nil { return false; } - WakeConditionVariable(&c._handle); + win32.WakeConditionVariable(&c._handle); return true; } condition_broadcast :: proc(c: ^Condition) -> bool { - if c._handle == nil { + if c._handle.ptr == nil { return false; } - WakeAllConditionVariable(&c._handle); + win32.WakeAllConditionVariable(&c._handle); return true; } condition_wait_for :: proc(c: ^Condition) -> bool { - return cast(bool)SleepConditionVariableCS(&c._handle, &c.mutex._critical_section, win32.INFINITE); + return cast(bool)win32.SleepConditionVariableCS(&c._handle, &c.mutex._critical_section, win32.INFINITE); }