Skip to content

Commit 21c4453

Browse files
committed
Always release GIL before calling Scintilla
See commit cba6b6a for more details
1 parent fa3666d commit 21c4453

File tree

3 files changed

+3
-717
lines changed

3 files changed

+3
-717
lines changed

PythonScript/src/CreateWrapper.py

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252

5353
castsRet = {
5454
'bool' : lambda val: 'return 0 != (' + val + ')',
55-
'boost::python::tuple': lambda val: 'int retVal = (int)' + val + ';\n' + reacquireGIL() + '\treturn boost::python::make_tuple(COLOUR_RED(retVal), COLOUR_GREEN(retVal), COLOUR_BLUE(retVal))'
55+
'boost::python::tuple': lambda val: 'int retVal = (int)' + val + ';\n' + '\treturn boost::python::make_tuple(COLOUR_RED(retVal), COLOUR_GREEN(retVal), COLOUR_BLUE(retVal))'
5656
}
5757

5858
# Must be kept in sync with pythonTypeExplosions
@@ -86,12 +86,6 @@
8686
def Contains(s,sub):
8787
return s.find(sub) != -1
8888

89-
def releaseGIL():
90-
return "\tGILRelease gilRelease;\n"
91-
92-
def reacquireGIL():
93-
return "\tgilRelease.reacquire();\n"
94-
9589
def symbolName(v):
9690
return "SCI_" + v["Name"].upper()
9791

@@ -118,32 +112,27 @@ def traceCall(v, out):
118112
def cellsBody(v, out):
119113
traceCall(v, out)
120114
checkDisallowedInCallback(v, out)
121-
out.write(releaseGIL())
122115
out.write("\treturn callScintilla(" + symbolName(v) + ", " + v["Param2Name"] + ".length(), reinterpret_cast<LPARAM>(" + v["Param2Name"] + ".cells()));\n")
123116

124117
def constString(v, out):
125118
#out.write("\tconst char *raw = boost::python::extract<const char *>(" + v["Param2Name"] + ".attr(\"__str__\")());\n")
126119
traceCall(v, out)
127120
checkDisallowedInCallback(v, out)
128121
out.write("\tstd::string s = getStringFromObject({0});\n".format(v["Param2Name"]))
129-
out.write(releaseGIL())
130122
out.write("\treturn callScintilla(" + symbolName(v) + ", s.size(), reinterpret_cast<LPARAM>(s.c_str()));\n");
131123

132124
def retString(v, out):
133125
traceCall(v, out)
134126
checkDisallowedInCallback(v, out)
135-
out.write(releaseGIL())
136127
out.write("\tPythonCompatibleStrBuffer result(callScintilla(" + symbolName(v) + ") + 1);\n")
137128
out.write("\t// result.size() does not depend on the order of evaluation here\n")
138129
out.write("\t//lint -e{864}\n")
139130
out.write("\tcallScintilla(" + symbolName(v) + ", result.size(), reinterpret_cast<LPARAM>(*result));\n")
140-
out.write(reacquireGIL())
141131
out.write("\treturn boost::python::str(result.c_str());\n")
142132

143133
def getLineBody(v, out):
144134
traceCall(v, out)
145135
checkDisallowedInCallback(v, out)
146-
out.write(releaseGIL())
147136
out.write("\tint lineCount = callScintilla(SCI_GETLINECOUNT);\n")
148137
out.write("\tif (line >= lineCount)\n")
149138
out.write("\t{\n")
@@ -153,14 +142,12 @@ def getLineBody(v, out):
153142
out.write("\t{\n")
154143
out.write("\t\tPythonCompatibleStrBuffer result(callScintilla(SCI_LINELENGTH, line));\n")
155144
out.write("\t\tcallScintilla(" + symbolName(v) + ", line, reinterpret_cast<LPARAM>(*result));\n")
156-
out.write(reacquireGIL())
157145
out.write("\t\treturn boost::python::str(result.c_str());\n")
158146
out.write("\t}\n")
159147

160148
def retStringNoLength(v, out):
161149
traceCall(v, out)
162150
checkDisallowedInCallback(v, out)
163-
out.write(releaseGIL())
164151
out.write("\tPythonCompatibleStrBuffer result(callScintilla(" + symbolName(v))
165152
if v["Param1Type"] != '' or v["Param2Type"] != '':
166153
out.write(", ")
@@ -183,7 +170,6 @@ def retStringNoLength(v, out):
183170
out.write("0");
184171

185172
out.write(", reinterpret_cast<LPARAM>(*result));\n")
186-
out.write(reacquireGIL())
187173
out.write("\treturn boost::python::str(result.c_str());\n")
188174

189175

@@ -192,35 +178,30 @@ def retStringFromKey(v, out):
192178
checkDisallowedInCallback(v, out)
193179
out.write('\tstd::string keyString = getStringFromObject({0});\n'.format(v["Param1Name"]))
194180

195-
out.write(releaseGIL())
196181
out.write("\tPythonCompatibleStrBuffer result(callScintilla({0}, reinterpret_cast<WPARAM>(keyString.c_str()), 0));\n".format(symbolName(v)))
197182

198183
out.write("\tcallScintilla({0}, reinterpret_cast<WPARAM>(keyString.c_str()), reinterpret_cast<LPARAM>(*result));\n".format(symbolName(v)))
199184

200-
out.write(reacquireGIL())
201185
out.write("\treturn boost::python::str(result.c_str());\n")
202186

203187

204188
def findTextBody(v, out):
205189
traceCall(v, out)
206190
checkDisallowedInCallback(v, out)
207191
out.write('\tstd::string search = getStringFromObject({0});\n'.format(v['Param2Name']))
208-
out.write(releaseGIL())
209192
out.write('\tSci_TextToFind src;\n')
210193
out.write('\tsrc.chrg.cpMin = start;\n')
211194
out.write('\tsrc.chrg.cpMax = end;\n')
212195
out.write('\t// We assume findText won\'t write to this buffer - it should be const\n')
213196
out.write('\tsrc.lpstrText = const_cast<char*>(search.c_str());\n')
214197
out.write('\tint result = callScintilla({0}, {1}, reinterpret_cast<LPARAM>(&src));\n'.format(symbolName(v), v["Param1Name"]))
215-
out.write(reacquireGIL())
216198
out.write('\tif (-1 == result)\n')
217199
out.write('\t{\n\t\treturn boost::python::object();\n\t}\n')
218200
out.write('\telse\n\t{\n\t\treturn boost::python::make_tuple(src.chrgText.cpMin, src.chrgText.cpMax);\n\t}\n')
219201

220202
def getTextRangeBody(v, out):
221203
traceCall(v, out)
222204
checkDisallowedInCallback(v, out)
223-
out.write(releaseGIL())
224205
out.write('\tSci_TextRange src;\n')
225206
out.write('\tif (end == -1)\n')
226207
out.write('\t{\n')
@@ -238,13 +219,11 @@ def getTextRangeBody(v, out):
238219
out.write('\tsrc.chrg.cpMax = end;\n')
239220
out.write('\tsrc.lpstrText = *result;\n')
240221
out.write('\tcallScintilla({0}, 0, reinterpret_cast<LPARAM>(&src));\n'.format(symbolName(v)))
241-
out.write(reacquireGIL())
242222
out.write('\treturn boost::python::str(result.c_str());\n')
243223

244224
def getStyledTextBody(v, out):
245225
traceCall(v, out)
246226
checkDisallowedInCallback(v, out)
247-
out.write(releaseGIL())
248227
out.write('\tSci_TextRange src;\n')
249228
out.write('\tif (end < start)\n')
250229
out.write('\t{\n')
@@ -256,7 +235,6 @@ def getStyledTextBody(v, out):
256235
out.write('\tsrc.chrg.cpMax = end;\n')
257236
out.write('\tsrc.lpstrText = new char[size_t(((end-start) * 2) + 2)];\n')
258237
out.write('\tcallScintilla({0}, 0, reinterpret_cast<LPARAM>(&src));\n'.format(symbolName(v)))
259-
out.write(reacquireGIL())
260238
out.write('\tboost::python::list styles;\n')
261239
out.write("\tPythonCompatibleStrBuffer result(end-start);\n")
262240
out.write('\tfor(idx_t pos = 0; pos < result.size() - 1; pos++)\n')
@@ -282,7 +260,6 @@ def annotationSetTextBody(v, out):
282260
out.write("\t\ts = getStringFromObject({0});\n".format(v["Param2Name"]))
283261
out.write('\t\tnewText = s.c_str();\n')
284262
out.write('\t}\n')
285-
out.write(releaseGIL())
286263
out.write("\tcallScintilla({0}, static_cast<WPARAM>({1}), reinterpret_cast<LPARAM>(newText));\n".format(symbolName(v), v["Param1Name"]));
287264

288265
def standardBody(v, out):
@@ -293,7 +270,6 @@ def standardBody(v, out):
293270
checkDisallowedInCallback(v, out)
294271
withGilParam(out, v['Param1Type'], v['Param1Name'])
295272
withGilParam(out, v['Param2Type'], v['Param2Name'])
296-
out.write(releaseGIL())
297273

298274
call = 'callScintilla(' + symbolName(v)
299275

PythonScript/src/ScintillaWrapper.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#endif
1919

2020
#include "MutexHolder.h"
21-
21+
#include "GILManager.h"
2222

2323
struct SCNotification;
2424

@@ -2934,6 +2934,7 @@ class ScintillaWrapper : public PyProducerConsumer<CallbackExecArgs>
29342934
// Call wrapper
29352935
LRESULT callScintilla(UINT message, WPARAM wParam = 0, LPARAM lParam = 0)
29362936
{
2937+
GILRelease release;
29372938
return SendMessage(m_handle, message, wParam, lParam);
29382939
}
29392940

0 commit comments

Comments
 (0)