123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- package sync
- import "core:sys/win32"
- import "core:atomics"
- Semaphore :: struct {
- _handle: win32.Handle,
- }
- Mutex :: struct {
- _critical_section: win32.Critical_Section,
- }
- Condition :: struct {
- event: win32.Handle,
- }
- current_thread_id :: proc() -> i32 {
- return i32(win32.get_current_thread_id());
- }
- semaphore_init :: proc(s: ^Semaphore) {
- s._handle = win32.create_semaphore_a(nil, 0, 1<<31-1, nil);
- }
- semaphore_destroy :: proc(s: ^Semaphore) {
- win32.close_handle(s._handle);
- }
- semaphore_post :: proc(s: ^Semaphore, count: int) {
- win32.release_semaphore(s._handle, i32(count), nil);
- }
- semaphore_release :: inline proc(s: ^Semaphore) {
- semaphore_post(s, 1);
- }
- semaphore_wait :: proc(s: ^Semaphore) {
- result := win32.wait_for_single_object(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));
- }
- mutex_destroy :: proc(m: ^Mutex) {
- win32.delete_critical_section(&m._critical_section);
- }
- mutex_lock :: proc(m: ^Mutex) {
- win32.enter_critical_section(&m._critical_section);
- }
- mutex_try_lock :: proc(m: ^Mutex) -> bool {
- return bool(win32.try_enter_critical_section(&m._critical_section));
- }
- mutex_unlock :: proc(m: ^Mutex) {
- win32.leave_critical_section(&m._critical_section);
- }
- condition_init :: proc(using c: ^Condition) {
- event = win32.create_event_a(nil, false, false, nil);
- assert(event != nil);
- }
- condition_signal :: proc(using c: ^Condition) {
- ok := win32.set_event(event);
- assert(bool(ok));
- }
- condition_wait_for :: proc(using c: ^Condition) {
- result := win32.wait_for_single_object(event, win32.INFINITE);
- assert(result != win32.WAIT_FAILED);
- }
- condition_destroy :: proc(using c: ^Condition) {
- if event != nil {
- win32.close_handle(event);
- }
- }
|