vxx2 / vlib / builtin / closure / closure_windows.c.v
66 lines · 54 sloc · 1.37 KB · 1a2d0e5b70d6dd1baaa60290f2446e9ece4324bf
Raw
1module closure
2
3#include <synchapi.h>
4#insert "@VEXEROOT/vlib/builtin/closure/closure_once_windows.h"
5
6fn C.v_closure_init_once(ClosureInitFn)
7
8struct ClosureMutex {
9 closure_mtx C.SRWLOCK
10}
11
12@[inline]
13fn 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]
20fn 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]
33fn 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]
44fn closure_mtx_lock_init_platform() {
45 C.InitializeSRWLock(&g_closure.closure_mtx)
46}
47
48@[inline]
49fn closure_mtx_lock_platform() {
50 C.AcquireSRWLockExclusive(&g_closure.closure_mtx)
51}
52
53@[inline]
54fn closure_mtx_unlock_platform() {
55 C.ReleaseSRWLockExclusive(&g_closure.closure_mtx)
56}
57
58@[inline]
59fn closure_current_thread_id_platform() u64 {
60 return u64(C.GetCurrentThreadId())
61}
62
63@[inline]
64fn closure_init_once_platform() {
65 C.v_closure_init_once(closure_init_body)
66}
67