-
Notifications
You must be signed in to change notification settings - Fork 13
/
mode.go
128 lines (108 loc) · 2.25 KB
/
mode.go
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright (c) 2014-2017 Bitmark Inc.
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.
package mode
import (
"github.com/bitmark-inc/bitmarkd/chain"
"github.com/bitmark-inc/bitmarkd/fault"
"github.com/bitmark-inc/logger"
"sync"
)
// type to hold the mode
type Mode int
// all possible modes
const (
Stopped Mode = iota
Resynchronise
Normal
maximum
)
var globals struct {
sync.RWMutex
log *logger.L
mode Mode
testing bool
chain string
}
// set up the mode system
func Initialise(chainName string) error {
// ensure start up in resynchronise mode
globals.Lock()
defer globals.Unlock()
globals.log = logger.New("mode")
globals.log.Info("starting…")
// default settings
globals.chain = chainName
globals.testing = false
globals.mode = Resynchronise
// override for specific chain
switch chainName {
case chain.Bitmark:
// no change
case chain.Testing, chain.Local:
globals.testing = true
default:
globals.log.Criticalf("mode cannot handle chain: '%s'", chainName)
return fault.ErrInvalidChain
}
return nil
}
// shutdown mode handling
func Finalise() {
Set(Stopped)
globals.log.Info("shutting down…")
}
// change mode
func Set(mode Mode) {
if mode >= Stopped && mode < maximum {
globals.Lock()
globals.mode = mode
globals.Unlock()
globals.log.Infof("set: %s", mode)
} else {
globals.log.Errorf("ignore invalid set: %d", mode)
}
}
// detect mode
func Is(mode Mode) bool {
globals.RLock()
defer globals.RUnlock()
return mode == globals.mode
}
// detect mode
func IsNot(mode Mode) bool {
globals.RLock()
defer globals.RUnlock()
return mode != globals.mode
}
// special for testing
func IsTesting() bool {
globals.RLock()
defer globals.RUnlock()
return globals.testing
}
// name of the current chain
func ChainName() string {
globals.RLock()
defer globals.RUnlock()
return globals.chain
}
// current mode represented as a string
func String() string {
globals.RLock()
defer globals.RUnlock()
return globals.mode.String()
}
// current mode rep[resented as a string
func (m Mode) String() string {
switch m {
case Stopped:
return "Stopped"
case Resynchronise:
return "Resynchronise"
case Normal:
return "Normal"
default:
return "*Unknown*"
}
}