-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmanager.go
73 lines (56 loc) · 1.21 KB
/
manager.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
package events
import (
"sync"
bitmask "github.com/theTardigrade/golang-infiniteBitmask"
)
// Manager contains data and methods to handle all
// event management.
// You can, however, call the public package-level
// functions, if you only want to use a default manager.
type Manager struct {
inner managerInner
innerInited bool
dataMutex sync.RWMutex
}
type managerInner struct {
bitmaskGenerator *bitmask.Generator
data handlerData
}
var (
defaultManager = NewManager()
)
// NewManager returns a pointer to an initialized
// Manager struct.
func NewManager() (m *Manager) {
m = &Manager{}
m.initInner()
return
}
func (m *Manager) initInner() {
defer m.dataMutex.Unlock()
m.dataMutex.Lock()
if m.innerInited {
return
}
m.inner.bitmaskGenerator = bitmask.NewGenerator()
m.inner.data = make(handlerData, 0, 1024)
m.innerInited = true
}
func (m *Manager) checkInner() {
var innerInited bool
func() {
defer m.dataMutex.RUnlock()
m.dataMutex.RLock()
innerInited = m.innerInited
}()
if !innerInited {
m.initInner()
}
}
func initManagerMethod(m **Manager) {
if mValue := *m; mValue == nil {
*m = defaultManager
} else if mValue != defaultManager {
mValue.checkInner()
}
}