]>
Commit | Line | Data |
---|---|---|
9b12e4fe JC |
1 | package system |
2 | ||
3 | // This file implements syscalls for Win32 events which are not implemented | |
4 | // in golang. | |
5 | ||
6 | import ( | |
7 | "syscall" | |
8 | "unsafe" | |
9 | ) | |
10 | ||
11 | var ( | |
12 | procCreateEvent = modkernel32.NewProc("CreateEventW") | |
13 | procOpenEvent = modkernel32.NewProc("OpenEventW") | |
14 | procSetEvent = modkernel32.NewProc("SetEvent") | |
15 | procResetEvent = modkernel32.NewProc("ResetEvent") | |
16 | procPulseEvent = modkernel32.NewProc("PulseEvent") | |
17 | ) | |
18 | ||
19 | // CreateEvent implements win32 CreateEventW func in golang. It will create an event object. | |
20 | func CreateEvent(eventAttributes *syscall.SecurityAttributes, manualReset bool, initialState bool, name string) (handle syscall.Handle, err error) { | |
21 | namep, _ := syscall.UTF16PtrFromString(name) | |
22 | var _p1 uint32 | |
23 | if manualReset { | |
24 | _p1 = 1 | |
25 | } | |
26 | var _p2 uint32 | |
27 | if initialState { | |
28 | _p2 = 1 | |
29 | } | |
30 | r0, _, e1 := procCreateEvent.Call(uintptr(unsafe.Pointer(eventAttributes)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(namep))) | |
31 | use(unsafe.Pointer(namep)) | |
32 | handle = syscall.Handle(r0) | |
33 | if handle == syscall.InvalidHandle { | |
34 | err = e1 | |
35 | } | |
36 | return | |
37 | } | |
38 | ||
39 | // OpenEvent implements win32 OpenEventW func in golang. It opens an event object. | |
40 | func OpenEvent(desiredAccess uint32, inheritHandle bool, name string) (handle syscall.Handle, err error) { | |
41 | namep, _ := syscall.UTF16PtrFromString(name) | |
42 | var _p1 uint32 | |
43 | if inheritHandle { | |
44 | _p1 = 1 | |
45 | } | |
46 | r0, _, e1 := procOpenEvent.Call(uintptr(desiredAccess), uintptr(_p1), uintptr(unsafe.Pointer(namep))) | |
47 | use(unsafe.Pointer(namep)) | |
48 | handle = syscall.Handle(r0) | |
49 | if handle == syscall.InvalidHandle { | |
50 | err = e1 | |
51 | } | |
52 | return | |
53 | } | |
54 | ||
55 | // SetEvent implements win32 SetEvent func in golang. | |
56 | func SetEvent(handle syscall.Handle) (err error) { | |
57 | return setResetPulse(handle, procSetEvent) | |
58 | } | |
59 | ||
60 | // ResetEvent implements win32 ResetEvent func in golang. | |
61 | func ResetEvent(handle syscall.Handle) (err error) { | |
62 | return setResetPulse(handle, procResetEvent) | |
63 | } | |
64 | ||
65 | // PulseEvent implements win32 PulseEvent func in golang. | |
66 | func PulseEvent(handle syscall.Handle) (err error) { | |
67 | return setResetPulse(handle, procPulseEvent) | |
68 | } | |
69 | ||
70 | func setResetPulse(handle syscall.Handle, proc *syscall.LazyProc) (err error) { | |
71 | r0, _, _ := proc.Call(uintptr(handle)) | |
72 | if r0 != 0 { | |
73 | err = syscall.Errno(r0) | |
74 | } | |
75 | return | |
76 | } | |
77 | ||
78 | var temp unsafe.Pointer | |
79 | ||
80 | // use ensures a variable is kept alive without the GC freeing while still needed | |
81 | func use(p unsafe.Pointer) { | |
82 | temp = p | |
83 | } |