Keep previous behaviour for sync but move to sys/windows

This commit is contained in:
gingerBill
2020-06-26 20:30:33 +01:00
parent d7b3f3a0e7
commit 231f91304a
+22 -31
View File
@@ -1,20 +1,20 @@
// +build windows // +build windows
package sync package sync
import "core:sys/win32" import win32 "core:sys/windows"
foreign import kernel32 "system:kernel32.lib" foreign import kernel32 "system:kernel32.lib"
// A lock that can only be held by one thread at once. // A lock that can only be held by one thread at once.
Mutex :: struct { Mutex :: struct {
_critical_section: win32.Critical_Section, _critical_section: win32.CRITICAL_SECTION,
} }
// Blocks until signalled. // Blocks until signalled.
// When signalled, awakens exactly one waiting thread. // When signalled, awakens exactly one waiting thread.
Condition :: struct { Condition :: struct {
_handle: WIN32_CONDITION_VARIABLE, _handle: win32.CONDITION_VARIABLE,
mutex: ^Mutex, mutex: ^Mutex,
} }
@@ -22,87 +22,78 @@ Condition :: struct {
// When waited upon, blocks until the internal count is greater than zero, then subtracts one. // 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. // Posting to the semaphore increases the count by one, or the provided amount.
Semaphore :: struct { Semaphore :: struct {
_handle: win32.Handle, _handle: win32.HANDLE,
} }
semaphore_init :: proc(s: ^Semaphore, initial_count := 0) { 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) { semaphore_destroy :: proc(s: ^Semaphore) {
win32.close_handle(s._handle); win32.CloseHandle(s._handle);
} }
semaphore_post :: proc(s: ^Semaphore, count := 1) { 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) { semaphore_wait_for :: proc(s: ^Semaphore) {
// NOTE(tetra, 2019-10-30): wait_for_single_object decrements the count before it returns. // 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); assert(result != win32.WAIT_FAILED);
} }
mutex_init :: proc(m: ^Mutex, spin_count := 0) { 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) { mutex_destroy :: proc(m: ^Mutex) {
win32.delete_critical_section(&m._critical_section); win32.DeleteCriticalSection(&m._critical_section);
} }
mutex_lock :: proc(m: ^Mutex) { mutex_lock :: proc(m: ^Mutex) {
win32.enter_critical_section(&m._critical_section); win32.EnterCriticalSection(&m._critical_section);
} }
mutex_try_lock :: proc(m: ^Mutex) -> bool { 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) { mutex_unlock :: proc(m: ^Mutex) {
win32.leave_critical_section(&m._critical_section); win32.LeaveCriticalSection(&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 ---
} }
condition_init :: proc(c: ^Condition, mutex: ^Mutex) -> bool { condition_init :: proc(c: ^Condition, mutex: ^Mutex) -> bool {
assert(mutex != nil); assert(mutex != nil);
InitializeConditionVariable(&c._handle); win32.InitializeConditionVariable(&c._handle);
c.mutex = mutex; c.mutex = mutex;
return c._handle != nil; return true;
} }
condition_destroy :: proc(c: ^Condition) { condition_destroy :: proc(c: ^Condition) {
if c._handle != nil { if c._handle.ptr != nil {
WakeAllConditionVariable(&c._handle); win32.WakeAllConditionVariable(&c._handle);
} }
} }
condition_signal :: proc(c: ^Condition) -> bool { condition_signal :: proc(c: ^Condition) -> bool {
if c._handle == nil { if c._handle.ptr == nil {
return false; return false;
} }
WakeConditionVariable(&c._handle); win32.WakeConditionVariable(&c._handle);
return true; return true;
} }
condition_broadcast :: proc(c: ^Condition) -> bool { condition_broadcast :: proc(c: ^Condition) -> bool {
if c._handle == nil { if c._handle.ptr == nil {
return false; return false;
} }
WakeAllConditionVariable(&c._handle); win32.WakeAllConditionVariable(&c._handle);
return true; return true;
} }
condition_wait_for :: proc(c: ^Condition) -> bool { 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);
} }