OSDN Git Service

new repo
[bytom/vapor.git] / vendor / golang.org / x / sys / windows / svc / example / service.go
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 // +build windows
6
7 package main
8
9 import (
10         "fmt"
11         "time"
12
13         "golang.org/x/sys/windows/svc"
14         "golang.org/x/sys/windows/svc/debug"
15         "golang.org/x/sys/windows/svc/eventlog"
16 )
17
18 var elog debug.Log
19
20 type myservice struct{}
21
22 func (m *myservice) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) {
23         const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue
24         changes <- svc.Status{State: svc.StartPending}
25         fasttick := time.Tick(500 * time.Millisecond)
26         slowtick := time.Tick(2 * time.Second)
27         tick := fasttick
28         changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}
29 loop:
30         for {
31                 select {
32                 case <-tick:
33                         beep()
34                         elog.Info(1, "beep")
35                 case c := <-r:
36                         switch c.Cmd {
37                         case svc.Interrogate:
38                                 changes <- c.CurrentStatus
39                                 // Testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4
40                                 time.Sleep(100 * time.Millisecond)
41                                 changes <- c.CurrentStatus
42                         case svc.Stop, svc.Shutdown:
43                                 break loop
44                         case svc.Pause:
45                                 changes <- svc.Status{State: svc.Paused, Accepts: cmdsAccepted}
46                                 tick = slowtick
47                         case svc.Continue:
48                                 changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}
49                                 tick = fasttick
50                         default:
51                                 elog.Error(1, fmt.Sprintf("unexpected control request #%d", c))
52                         }
53                 }
54         }
55         changes <- svc.Status{State: svc.StopPending}
56         return
57 }
58
59 func runService(name string, isDebug bool) {
60         var err error
61         if isDebug {
62                 elog = debug.New(name)
63         } else {
64                 elog, err = eventlog.Open(name)
65                 if err != nil {
66                         return
67                 }
68         }
69         defer elog.Close()
70
71         elog.Info(1, fmt.Sprintf("starting %s service", name))
72         run := svc.Run
73         if isDebug {
74                 run = debug.Run
75         }
76         err = run(name, &myservice{})
77         if err != nil {
78                 elog.Error(1, fmt.Sprintf("%s service failed: %v", name, err))
79                 return
80         }
81         elog.Info(1, fmt.Sprintf("%s service stopped", name))
82 }