Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
* Tkapp_CallArgs, Tkapp_CallResult, AsObj require both locks
* Tkapp_CallDeallocArgs requires Tcl lock
  • Loading branch information
native-api committed May 17, 2018
commit e828ea7ff6becc178dd7611a721d0e53b605c54a
30 changes: 22 additions & 8 deletions Modules/_tkinter.c
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,13 @@ static PyThreadState *tcl_tstate = NULL;
{ PyThreadState *tstate = PyEval_SaveThread(); \
if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1); tcl_tstate = tstate; }

#define ENTER_PYTHON_OVERLAP \
{ PyThreadState *tstate = tcl_tstate; tcl_tstate = NULL; PyEval_RestoreThread((tstate)); }

#define LEAVE_PYTHON_OVERLAP \
{ PyThreadState *tstate = PyEval_SaveThread(); tcl_tstate = tstate; }


#define CHECK_TCL_APPARTMENT \
if (((TkappObject *)self)->threaded && \
((TkappObject *)self)->thread_id != Tcl_GetCurrentThread()) { \
Expand Down Expand Up @@ -1405,17 +1412,17 @@ Tkapp_CallProc(Tkapp_CallEvent *e, int flags)
Tcl_Obj **objv;
int objc;
int i;
ENTER_PYTHON
ENTER_PYTHON_OVERLAP
objv = Tkapp_CallArgs(e->args, objStore, &objc);
if (!objv) {
PyErr_Fetch(e->exc_type, e->exc_value, e->exc_tb);
*(e->res) = NULL;
}
LEAVE_PYTHON
LEAVE_PYTHON_OVERLAP
if (!objv)
goto done;
i = Tcl_EvalObjv(e->self->interp, objc, objv, e->flags);
ENTER_PYTHON
ENTER_PYTHON_OVERLAP
if (i == TCL_ERROR) {
*(e->res) = NULL;
*(e->exc_type) = NULL;
Expand All @@ -1427,7 +1434,7 @@ Tkapp_CallProc(Tkapp_CallEvent *e, int flags)
else {
*(e->res) = Tkapp_CallResult(e->self);
}
LEAVE_PYTHON
LEAVE_PYTHON_OVERLAP

Tkapp_CallDeallocArgs(objv, objStore, objc);
done:
Expand Down Expand Up @@ -1520,7 +1527,11 @@ Tkapp_Call(PyObject *selfptr, PyObject *args)
else
res = Tkapp_CallResult(self);

LEAVE_OVERLAP

Tkapp_CallDeallocArgs(objv, objStore, objc);

ENTER_OVERLAP

}
LEAVE_OVERLAP_TCL
Expand Down Expand Up @@ -2379,15 +2390,18 @@ PythonCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char *argv[
if (res == NULL)
return PythonCmd_Error(interp);

ENTER_TCL
ENTER_OVERLAP
obj_res = AsObj(res);
if (obj_res) {
Tcl_SetObjResult(interp, obj_res);
rv = TCL_OK;
}
LEAVE_OVERLAP_TCL
if (obj_res == NULL) {
Py_DECREF(res);
return PythonCmd_Error(interp);
}
else {
Tcl_SetObjResult(interp, obj_res);
rv = TCL_OK;
}

Py_DECREF(res);

Expand Down