Skip to content

Commit 55494f4

Browse files
committed
* Tkapp_CallArgs, Tkapp_CallResult, AsObj require both locks
* Tkapp_CallDeallocArgs requires Tcl lock
1 parent 5b69c1f commit 55494f4

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

Modules/_tkinter.c

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,13 @@ static PyThreadState *tcl_tstate = NULL;
233233
{ PyThreadState *tstate = PyEval_SaveThread(); \
234234
if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1); tcl_tstate = tstate; }
235235

236+
#define ENTER_PYTHON_OVERLAP \
237+
{ PyThreadState *tstate = tcl_tstate; tcl_tstate = NULL; PyEval_RestoreThread((tstate)); }
238+
239+
#define LEAVE_PYTHON_OVERLAP \
240+
{ PyThreadState *tstate = PyEval_SaveThread(); tcl_tstate = tstate; }
241+
242+
236243
#define CHECK_TCL_APPARTMENT \
237244
if (((TkappObject *)self)->threaded && \
238245
((TkappObject *)self)->thread_id != Tcl_GetCurrentThread()) { \
@@ -249,6 +256,8 @@ static PyThreadState *tcl_tstate = NULL;
249256
#define LEAVE_OVERLAP_TCL
250257
#define ENTER_PYTHON
251258
#define LEAVE_PYTHON
259+
#define ENTER_PYTHON_OVERLAP
260+
#define LEAVE_PYTHON_OVERLAP
252261
#define CHECK_TCL_APPARTMENT
253262

254263
#endif
@@ -1551,17 +1560,17 @@ Tkapp_CallProc(Tkapp_CallEvent *e, int flags)
15511560
Tcl_Obj **objv;
15521561
int objc;
15531562
int i;
1554-
ENTER_PYTHON
1563+
ENTER_PYTHON_OVERLAP
15551564
objv = Tkapp_CallArgs(e->args, objStore, &objc);
15561565
if (!objv) {
15571566
PyErr_Fetch(e->exc_type, e->exc_value, e->exc_tb);
15581567
*(e->res) = NULL;
15591568
}
1560-
LEAVE_PYTHON
1569+
LEAVE_PYTHON_OVERLAP
15611570
if (!objv)
15621571
goto done;
15631572
i = Tcl_EvalObjv(e->self->interp, objc, objv, e->flags);
1564-
ENTER_PYTHON
1573+
ENTER_PYTHON_OVERLAP
15651574
if (i == TCL_ERROR) {
15661575
*(e->res) = NULL;
15671576
*(e->exc_type) = NULL;
@@ -1573,7 +1582,7 @@ Tkapp_CallProc(Tkapp_CallEvent *e, int flags)
15731582
else {
15741583
*(e->res) = Tkapp_CallResult(e->self);
15751584
}
1576-
LEAVE_PYTHON
1585+
LEAVE_PYTHON_OVERLAP
15771586

15781587
Tkapp_CallDeallocArgs(objv, objStore, objc);
15791588
done:
@@ -1669,7 +1678,11 @@ Tkapp_Call(PyObject *selfptr, PyObject *args)
16691678
else
16701679
res = Tkapp_CallResult(self);
16711680

1681+
LEAVE_OVERLAP
1682+
16721683
Tkapp_CallDeallocArgs(objv, objStore, objc);
1684+
1685+
ENTER_OVERLAP
16731686

16741687
}
16751688
LEAVE_OVERLAP_TCL
@@ -2492,15 +2505,18 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[])
24922505
if (res == NULL)
24932506
return PythonCmd_Error(interp);
24942507

2508+
ENTER_TCL
2509+
ENTER_OVERLAP
24952510
obj_res = AsObj(res);
2511+
if (obj_res) {
2512+
Tcl_SetObjResult(interp, obj_res);
2513+
rv = TCL_OK;
2514+
}
2515+
LEAVE_OVERLAP_TCL
24962516
if (obj_res == NULL) {
24972517
Py_DECREF(res);
24982518
return PythonCmd_Error(interp);
24992519
}
2500-
else {
2501-
Tcl_SetObjResult(interp, obj_res);
2502-
rv = TCL_OK;
2503-
}
25042520

25052521
Py_DECREF(res);
25062522

0 commit comments

Comments
 (0)