-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclosers.go
118 lines (95 loc) · 2.51 KB
/
closers.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
package basics
import (
"sync/atomic"
)
// RegisterPeripheral adds a peripheral/closable into our global closers set.
// a basics.Peripheral object is a closable instance.
func RegisterPeripheral(servers ...Peripheral) { closers.RegisterPeripheral(servers...) }
// RegisterClosable adds a peripheral/closable into our global closers set.
// a basics.Peripheral object is a closable instance.
func RegisterClosable(servers ...Closable) { closers.RegisterClosable(servers...) }
// RegisterCloseFns adds a simple closure into our global closers set
func RegisterCloseFns(fns ...func()) { closers.RegisterCloseFns(fns...) }
// RegisterCloseFn adds a simple closure into our global closers set
func RegisterCloseFn(fn func()) { closers.RegisterCloseFn(fn) }
// RegisterClosers adds a simple closure into our global closers set
func RegisterClosers(cc ...Closer) { closers.RegisterClosers(cc...) }
// Close will cleanup all registered closers.
// You must make a call to Close before your app shutting down. For example:
//
// func main() {
// defer basics.Close()
// // ...
// }
func Close() {
closers.Close()
}
// Closers returns the closers set as a basics.Peripheral
func Closers() Peripheral { return closers }
// ClosersClosers returns the closers set as a basics.Peripheral array
func ClosersClosers() []Peripheral { return closers.closers }
var closers = new(c)
type c struct {
closers []Peripheral
closed int32
}
func (s *c) RegisterPeripheral(servers ...Peripheral) {
s.closers = append(s.closers, servers...)
}
func (s *c) RegisterClosable(servers ...Closable) {
for _, ci := range servers {
s.closers = append(s.closers, ci)
}
}
func (s *c) RegisterCloseFns(fns ...func()) {
s.closers = append(s.closers, &w{fns})
}
func (s *c) RegisterCloseFn(fn func()) {
s.closers = append(s.closers, &cf{fn})
}
func (s *c) RegisterClosers(cc ...Closer) {
for _, ci := range cc {
if ci != nil {
s.closers = append(s.closers, &cw{ci})
}
}
}
func (s *c) Close() {
if atomic.CompareAndSwapInt32(&s.closed, 0, 1) {
verbose("closing registered closers...")
for _, c := range s.closers {
// log.Debugf(" c.Close(), %v", c)
if c != nil {
c.Close()
}
}
}
}
type cw struct {
cc Closer
}
func (s *cw) Close() {
if s.cc != nil {
if err := s.cc.Close(); err != nil {
println("closing Closer failed.", err)
}
}
}
type w struct {
fns []func()
}
func (s *w) Close() {
for _, c := range s.fns {
if c != nil {
c()
}
}
}
type cf struct {
fn func()
}
func (s *cf) Close() {
if s.fn != nil {
s.fn()
}
}