github.com/hustcat/docker@v1.3.3-0.20160314103604-901c67a8eeab/pkg/system/events_windows.go (about) 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 }