-
Notifications
You must be signed in to change notification settings - Fork 0
/
close_event.go
52 lines (43 loc) · 1 KB
/
close_event.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
package util
import (
"log"
"sort"
"sync"
)
// closeEvents 关闭事件
var closeEvents map[int]func() (errs []error)
// closedErrorHandler 关闭错误处理事件
var closedErrorHandler func(err error)
var m sync.Mutex
func init() {
closeEvents = make(map[int]func() (errs []error), 2)
closedErrorHandler = func(err error) {
log.Printf("Close Event Trigger Error:%s\n", err)
}
}
// Inject 关闭时发生错误处理方法
func Inject(handler func(err error)) {
closedErrorHandler = handler
}
// CloserAdd 添加关闭事件 level 等级越低越先关闭
func CloserAdd(level int, event func() (errs []error)) {
m.Lock()
closeEvents[level] = event
m.Unlock()
}
// Close .
func Close() {
levels := make([]int, 0, len(closeEvents))
for k := range closeEvents {
levels = append(levels, k)
}
sort.Ints(levels)
for i := 0; i < len(levels); i++ {
event := closeEvents[levels[i]]
if errs := event(); len(errs) > 0 {
for j := 0; j < len(errs); j++ {
closedErrorHandler(errs[j])
}
}
}
}