github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/osext/winsvc/svc/event.go (about) 1 // Copyright 2012 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package svc 6 7 import ( 8 "chai2010.gopkg/osext/winsvc/winapi" 9 "errors" 10 "syscall" 11 ) 12 13 // event represents auto-reset, initially non-signaled windows event. 14 // It is used to communicate between go and asm parts of this package. 15 type event struct { 16 h syscall.Handle 17 } 18 19 func newEvent() (*event, error) { 20 h, err := winapi.CreateEvent(nil, 0, 0, nil) 21 if err != nil { 22 return nil, err 23 } 24 return &event{h: h}, nil 25 } 26 27 func (e *event) Close() error { 28 return syscall.CloseHandle(e.h) 29 } 30 31 func (e *event) Set() error { 32 return winapi.SetEvent(e.h) 33 } 34 35 func (e *event) Wait() error { 36 s, err := syscall.WaitForSingleObject(e.h, syscall.INFINITE) 37 switch s { 38 case syscall.WAIT_OBJECT_0: 39 break 40 case syscall.WAIT_FAILED: 41 return err 42 default: 43 return errors.New("unexpected result from WaitForSingleObject") 44 } 45 return nil 46 }