-
Notifications
You must be signed in to change notification settings - Fork 0
/
luaunit.go
135 lines (107 loc) · 2.22 KB
/
luaunit.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
129
130
131
132
133
134
135
package luatiny
import (
"fmt"
"github.com/camsiabor/golua/lua"
"github.com/camsiabor/qcom/qerr"
"github.com/camsiabor/qcom/util"
"github.com/camsiabor/qservice/qtiny"
"log"
"path/filepath"
"sync"
)
type Luaunit struct {
Ls []*lua.State
instance int
instQueue chan *lua.State
guide *LuaTinyGuide
tina *qtiny.Tina
err error
name string
main string
path string
logger *log.Logger
config map[string]interface{}
mutex sync.RWMutex
nanoMutex sync.RWMutex
nanos map[string]*qtiny.Nano
}
func (o *Luaunit) start(restart bool) (err error) {
defer func() {
var pan = recover()
if pan != nil {
err = util.AsError(pan)
}
if err != nil {
o.err = err
}
}()
o.mutex.Lock()
defer o.mutex.Unlock()
if o.Ls != nil {
o.stop(false)
}
if !util.GetBool(o.config, true, "active") {
return nil
}
o.instance = util.GetInt(o.config, 1, "instance")
if o.instance <= 0 {
return nil
}
if len(o.main) == 0 {
o.main = util.GetStr(o.config, "", "main")
}
if len(o.main) == 0 {
return qerr.StackStringErr(0, 1024, o.string(), "main is not set")
}
o.path, err = filepath.Abs(o.guide.LuaPath + "/" + o.main)
if err != nil {
return err
}
o.err = o.init(restart)
if o.err == nil {
o.logger.Println(o.string(), "start")
}
return o.err
}
func (o *Luaunit) stop(lock bool) {
if lock {
o.mutex.Lock()
defer o.mutex.Unlock()
}
if o.nanos != nil {
func() {
o.nanoMutex.Lock()
defer o.nanoMutex.Unlock()
for _, nano := range o.nanos {
var err = o.guide.tiny.NanoLocalUnregister(nano)
if err == nil {
o.logger.Println(o.string(), "lua nano unregister -> ", nano.Address)
} else {
o.logger.Println(o.string(), "lua nano unregister fail -> ", nano.Address, " : ", err.Error())
}
}
o.nanos = nil
}()
}
if o.Ls != nil {
for i := 0; i < len(o.Ls); i++ {
if o.Ls[i] != nil {
o.Ls[i].Close()
o.Ls[i] = nil
}
}
o.Ls = nil
o.instance = 0
}
if o.instQueue != nil {
close(o.instQueue)
o.instQueue = nil
}
o.logger.Println(o.string(), "stop")
}
func (o *Luaunit) string() string {
return fmt.Sprintf("[ %v | %v | [%v] | %v ]", o.guide.Name, o.name, o.instance, o.path)
}
func (o *Luaunit) GetTina() *qtiny.Tina {
return o.tina
}