-
Notifications
You must be signed in to change notification settings - Fork 0
/
env.go
70 lines (60 loc) · 1.25 KB
/
env.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
package main
import (
"os"
"path"
"runtime"
"sync"
python "github.com/M-Quadra/go-python3-submodule/v10"
"github.com/M-Quadra/go-python3-submodule/v10/py"
pyeval "github.com/M-Quadra/go-python3-submodule/v10/py-eval"
pygilstate "github.com/M-Quadra/go-python3-submodule/v10/py-gil-state"
pylist "github.com/M-Quadra/go-python3-submodule/v10/py-list"
pysys "github.com/M-Quadra/go-python3-submodule/v10/py-sys"
pyunicode "github.com/M-Quadra/go-python3-submodule/v10/py-unicode"
)
func init() {
py.Finalize()
py.Initialize()
if !py.IsInitialized() {
os.Exit(-1)
}
paths := pysys.GetObject("path")
if paths == nil {
os.Exit(-1)
}
_, file, _, ok := runtime.Caller(0)
if !ok {
os.Exit(-1)
}
wd := path.Dir(file)
wdUnicode := pyunicode.FromString(wd)
defer py.DecRef(wdUnicode)
if !pylist.Append(paths, wdUnicode) {
os.Exit(-1)
}
}
var (
_m = sync.Mutex{}
_ok bool
_save *python.PyThreadState
_gstate python.PyGILState
)
// Lock GIL
func Lock() {
_m.Lock()
runtime.LockOSThread()
_ok = pygilstate.Check()
if !_ok {
_save = pyeval.SaveThread()
_gstate = pygilstate.Ensure()
}
}
// Unlock GIL
func Unlock() {
if !_ok {
pygilstate.Release(_gstate)
pyeval.RestoreThread(_save)
}
runtime.UnlockOSThread()
_m.Unlock()
}