events_windows.go 2.3 KB

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