//+build darwin //+private package sync2 import "core:time" import "core:c" import "core:intrinsics" foreign import pthread "System.framework" _current_thread_id :: proc "contextless" () -> int { tid: u64; // NOTE(Oskar): available from OSX 10.6 and iOS 3.2. // For older versions there is `syscall(SYS_thread_selfid)`, but not really // the same thing apparently. foreign pthread { pthread_threadid_np :: proc "c" (rawptr, ^u64) -> c.int ---; } pthread_threadid_np(nil, &tid); return int(tid); } foreign { @(link_name="usleep") _darwin_usleep :: proc "c" (us: uint) -> i32 --- @(link_name="sched_yield") _darwin_sched_yield :: proc "c" () -> i32 --- } _atomic_try_wait_slow :: proc(ptr: ^u32, val: u32) { history: uint = 10; for { // Exponential wait _darwin_usleep(history >> 2); history += history >> 2; if history > (1 << 10) { history = 1 << 10; } if atomic_load(ptr) != val { break; } } } _atomic_wait :: proc(ptr: ^u32, val: u32) { if intrinsics.expect(atomic_load(ptr) != val, true) { return; } for i in 0..<16 { if atomic_load(ptr) != val { return; } if i < 12 { intrinsics.cpu_relax(); } else { _darwin_sched_yield(); } } for val == atomic_load(ptr) { _atomic_try_wait_slow(ptr, val); } } _Mutex :: struct { } _mutex_lock :: proc(m: ^Mutex) { } _mutex_unlock :: proc(m: ^Mutex) { } _mutex_try_lock :: proc(m: ^Mutex) -> bool { return false; } _RW_Mutex :: struct { } _rw_mutex_lock :: proc(rw: ^RW_Mutex) { } _rw_mutex_unlock :: proc(rw: ^RW_Mutex) { } _rw_mutex_try_lock :: proc(rw: ^RW_Mutex) -> bool { return false; } _rw_mutex_shared_lock :: proc(rw: ^RW_Mutex) { } _rw_mutex_shared_unlock :: proc(rw: ^RW_Mutex) { } _rw_mutex_try_shared_lock :: proc(rw: ^RW_Mutex) -> bool { return false; } _Recursive_Mutex :: struct { } _recursive_mutex_lock :: proc(m: ^Recursive_Mutex) { } _recursive_mutex_unlock :: proc(m: ^Recursive_Mutex) { } _recursive_mutex_try_lock :: proc(m: ^Recursive_Mutex) -> bool { return false; } _Cond :: struct { } _cond_wait :: proc(c: ^Cond, m: ^Mutex) { } _cond_wait_with_timeout :: proc(c: ^Cond, m: ^Mutex, timeout: time.Duration) -> bool { return false; } _cond_signal :: proc(c: ^Cond) { } _cond_broadcast :: proc(c: ^Cond) { } _Sema :: struct { } _sema_wait :: proc(s: ^Sema) { } _sema_post :: proc(s: ^Sema, count := 1) { }