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  }