| 1 | module closure |
| 2 | |
| 3 | #include <synchapi.h> |
| 4 | #insert "@VEXEROOT/vlib/builtin/closure/closure_once_windows.h" |
| 5 | |
| 6 | fn C.v_closure_init_once(ClosureInitFn) |
| 7 | |
| 8 | struct ClosureMutex { |
| 9 | closure_mtx C.SRWLOCK |
| 10 | } |
| 11 | |
| 12 | @[inline] |
| 13 | fn closure_alloc_platform() &u8 { |
| 14 | p := &u8(C.VirtualAlloc(0, g_closure.v_page_size * 2, C.MEM_COMMIT | C.MEM_RESERVE, |
| 15 | C.PAGE_READWRITE)) |
| 16 | return p |
| 17 | } |
| 18 | |
| 19 | @[inline] |
| 20 | fn closure_memory_protect_platform(ptr voidptr, size isize, attr MemoryProtectAtrr) { |
| 21 | mut tmp := u32(0) |
| 22 | match attr { |
| 23 | .read_exec { |
| 24 | _ := C.VirtualProtect(ptr, size, C.PAGE_EXECUTE_READ, &tmp) |
| 25 | } |
| 26 | .read_write { |
| 27 | _ := C.VirtualProtect(ptr, size, C.PAGE_READWRITE, &tmp) |
| 28 | } |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | @[inline] |
| 33 | fn get_page_size_platform() int { |
| 34 | // Determine system page size |
| 35 | mut si := C.SYSTEM_INFO{} |
| 36 | C.GetNativeSystemInfo(&si) |
| 37 | |
| 38 | // Calculate required allocation size |
| 39 | page_size := int(si.dwPageSize) * (((assumed_page_size - 1) / int(si.dwPageSize)) + 1) |
| 40 | return page_size |
| 41 | } |
| 42 | |
| 43 | @[inline] |
| 44 | fn closure_mtx_lock_init_platform() { |
| 45 | C.InitializeSRWLock(&g_closure.closure_mtx) |
| 46 | } |
| 47 | |
| 48 | @[inline] |
| 49 | fn closure_mtx_lock_platform() { |
| 50 | C.AcquireSRWLockExclusive(&g_closure.closure_mtx) |
| 51 | } |
| 52 | |
| 53 | @[inline] |
| 54 | fn closure_mtx_unlock_platform() { |
| 55 | C.ReleaseSRWLockExclusive(&g_closure.closure_mtx) |
| 56 | } |
| 57 | |
| 58 | @[inline] |
| 59 | fn closure_current_thread_id_platform() u64 { |
| 60 | return u64(C.GetCurrentThreadId()) |
| 61 | } |
| 62 | |
| 63 | @[inline] |
| 64 | fn closure_init_once_platform() { |
| 65 | C.v_closure_init_once(closure_init_body) |
| 66 | } |
| 67 | |