~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/gabriel-samfira/sys/windows/svc/example/service.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
        "github.com/gabriel-samfira/sys/windows/svc"
 
14
        "github.com/gabriel-samfira/sys/windows/svc/debug"
 
15
        "github.com/gabriel-samfira/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
}