@@ -8,6 +8,14 @@ import (
8
8
"fmt"
9
9
)
10
10
11
+ // PyGILState is the Go alias for the PyGILState_STATE enum
12
+ type PyGILState C.PyGILState_STATE
13
+
14
+ // PyThreadState layer
15
+ type PyThreadState struct {
16
+ ptr * C.PyThreadState
17
+ }
18
+
11
19
// Initialize initializes the python interpreter and its GIL
12
20
func Initialize () error {
13
21
// make sure the python interpreter has been initialized
@@ -35,4 +43,62 @@ func Finalize() error {
35
43
return nil
36
44
}
37
45
46
+ // PyThreadState* PyEval_SaveThread()
47
+ // Release the global interpreter lock (if it has been created and thread
48
+ // support is enabled) and reset the thread state to NULL, returning the
49
+ // previous thread state (which is not NULL). If the lock has been created,
50
+ // the current thread must have acquired it. (This function is available even
51
+ // when thread support is disabled at compile time.)
52
+ func PyEval_SaveThread () * PyThreadState {
53
+ state := C .PyEval_SaveThread ()
54
+ return & PyThreadState {ptr : state }
55
+ }
56
+
57
+ // void PyEval_RestoreThread(PyThreadState *tstate)
58
+ // Acquire the global interpreter lock (if it has been created and thread
59
+ // support is enabled) and set the thread state to tstate, which must not be
60
+ // NULL. If the lock has been created, the current thread must not have
61
+ // acquired it, otherwise deadlock ensues. (This function is available even
62
+ // when thread support is disabled at compile time.)
63
+ func PyEval_RestoreThread (state * PyThreadState ) {
64
+ C .PyEval_RestoreThread (state .ptr )
65
+ }
66
+
67
+ // Ensure that the current thread is ready to call the Python C API regardless
68
+ // of the current state of Python, or of the global interpreter lock. This may
69
+ // be called as many times as desired by a thread as long as each call is
70
+ // matched with a call to PyGILState_Release(). In general, other thread-related
71
+ // APIs may be used between PyGILState_Ensure() and PyGILState_Release() calls
72
+ // as long as the thread state is restored to its previous state before the
73
+ // Release(). For example, normal usage of the Py_BEGIN_ALLOW_THREADS and
74
+ // Py_END_ALLOW_THREADS macros is acceptable.
75
+ //
76
+ // The return value is an opaque “handle” to the thread state when
77
+ // PyGILState_Ensure() was called, and must be passed to PyGILState_Release()
78
+ // to ensure Python is left in the same state. Even though recursive calls are
79
+ // allowed, these handles cannot be shared - each unique call to
80
+ // PyGILState_Ensure() must save the handle for its call to PyGILState_Release().
81
+ //
82
+ // When the function returns, the current thread will hold the GIL and be able
83
+ // to call arbitrary Python code. Failure is a fatal error.
84
+ //
85
+ // New in version 2.3.
86
+ func PyGILState_Ensure () PyGILState {
87
+ return PyGILState (C .PyGILState_Ensure ())
88
+ }
89
+
90
+ // void PyGILState_Release(PyGILState_STATE)
91
+ // Release any resources previously acquired. After this call, Python’s state
92
+ // will be the same as it was prior to the corresponding PyGILState_Ensure()
93
+ // call (but generally this state will be unknown to the caller, hence the use
94
+ // of the GILState API).
95
+ //
96
+ // Every call to PyGILState_Ensure() must be matched by a call to
97
+ // PyGILState_Release() on the same thread.
98
+ //
99
+ // New in version 2.3.
100
+ func PyGILState_Release (state PyGILState ) {
101
+ C .PyGILState_Release (C .PyGILState_STATE (state ))
102
+ }
103
+
38
104
// EOF
0 commit comments