派生自 libgowrapper/face

zhangmeng
2020-01-15 ee1ea6dc3930a07d78c6fd7b6238fa44cde06d79
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package common
 
import (
    "context"
    "os"
    "sync"
    "time"
)
 
// Disturber stop
type Disturber struct {
    mtx    sync.Mutex
    live   bool
    until  int
    maxTry int
}
 
// NewDisturber new
func NewDisturber(maxTry int) *Disturber {
    return &Disturber{
        live:   true,
        until:  0,
        maxTry: maxTry,
    }
}
 
// Prevent prevent
func (d *Disturber) Prevent() {
    d.mtx.Lock()
    defer d.mtx.Unlock()
    d.live = true
}
 
// MaybeReboot reboot
func (d *Disturber) MaybeReboot(ctx context.Context, fn func(...interface{})) {
    d.live = true
    for {
        select {
        case <-ctx.Done():
            return
        default:
            d.mtx.Lock()
            running := d.live
            d.mtx.Unlock()
 
            if running {
                d.until = 0
 
                d.mtx.Lock()
                d.live = false
                d.mtx.Unlock()
 
            } else {
                d.until++
                fn("!!!!!!No Running: ", d.until)
                if d.until > d.maxTry {
                    fn("!!!!!!Too Long Running, Reboot: ", d.maxTry)
                    os.Exit(0)
                }
            }
            time.Sleep(time.Second)
        }
    }
}