/
module_mgr.go
87 lines (76 loc) · 2.08 KB
/
module_mgr.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
package module
import (
"github.com/Cyinx/einx/agent"
"github.com/Cyinx/einx/event"
"github.com/Cyinx/einx/timer"
"sync"
)
//var module_map map[string]Module = make(map[string]Module)
var module_map sync.Map
var wait_close sync.WaitGroup
var PerfomancePrint bool = false
func GenModuleID() AgentID {
return agent.GenAgentID()
}
func Close() {
module_map.Range(func(k interface{}, m interface{}) bool {
m.(ModuleWoker).Close()
return true
})
worker_pools_map.Range(func(k interface{}, m interface{}) bool {
m.(*ModuleWorkerPool).Close()
return true
})
wait_close.Wait()
}
func NewModule(name string) Module {
m := &module{
id: GenModuleID(),
evQueue: event.NewEventQueue(),
name: name,
timerManager: timer.NewTimerManager(),
msgHandlerMap: make(map[ProtoTypeID]MsgHandler),
rpcHandlerMap: make(map[string]RpcHandler),
agentMap: make(map[AgentID]Agent),
commgrMap: make(map[ComponentID]ComponentMgr),
componentMap: make(map[ComponentID]Component),
rpcMsgPool: &sync.Pool{New: func() interface{} { return new(RpcEventMsg) }},
dataMsgPool: &sync.Pool{New: func() interface{} { return new(DataEventMsg) }},
eventMsgPool: &sync.Pool{New: func() interface{} { return new(SessionEventMsg) }},
awaitMsgPool: &sync.Pool{New: func() interface{} { return new(AwaitRpcEventMsg) }},
closeChan: make(chan bool),
eventList: make([]interface{}, MODULE_EVENT_LENGTH),
}
m.context = &ModuleContext{m: m}
return m
}
func GetModule(name string) Module {
var m Module
v, ok := module_map.Load(name)
if ok == false {
m = NewModule(name)
module_map.Store(name, m)
} else {
m = v.(Module)
}
return m
}
func FindModule(name string) Module {
var m Module
v, ok := module_map.Load(name)
if ok == true {
m = v.(Module)
return m
}
return nil
}
func Start() {
module_map.Range(func(k interface{}, m interface{}) bool {
go func(m interface{}) { m.(ModuleWoker).Run(&wait_close) }(m)
return true
})
worker_pools_map.Range(func(k interface{}, m interface{}) bool {
m.(*ModuleWorkerPool).Start()
return true
})
}