diff --git a/Misc/NEWS b/Misc/NEWS index a50f29d22ba..c395d06fc62 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -197,6 +197,9 @@ Core and Builtins Library ------- +- Adjusted _tkinter to compile without warnings when WITH_THREAD is not + defined (part of issue #5035). + - Issue #5561: Removed the sys.version_info shortcuts from platform's python_version() and python_version_tuple() since they produced different output compared to previous Python versions. diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index 4056bcd412e..b4031db793e 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -734,6 +734,7 @@ Tkapp_New(char *screenName, char *baseName, char *className, } +#ifdef WITH_THREAD static void Tkapp_ThreadSend(TkappObject *self, Tcl_Event *ev, Tcl_Condition *cond, Tcl_Mutex *mutex) @@ -746,6 +747,7 @@ Tkapp_ThreadSend(TkappObject *self, Tcl_Event *ev, Tcl_MutexUnlock(mutex); Py_END_ALLOW_THREADS } +#endif /** Tcl Eval **/ @@ -1135,8 +1137,8 @@ FromObj(PyObject* tkapp, Tcl_Obj *value) return newPyTclObject(value); } +#ifdef WITH_THREAD /* This mutex synchronizes inter-thread command calls. */ - TCL_DECLARE_MUTEX(call_mutex) typedef struct Tkapp_CallEvent { @@ -1148,6 +1150,7 @@ typedef struct Tkapp_CallEvent { PyObject **exc_type, **exc_value, **exc_tb; Tcl_Condition *done; } Tkapp_CallEvent; +#endif void Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc) @@ -1258,6 +1261,8 @@ Tkapp_CallResult(TkappObject *self) return res; } +#ifdef WITH_THREAD + /* Tkapp_CallProc is the event procedure that is executed in the context of the Tcl interpreter thread. Initially, it holds the Tcl lock, and doesn't hold the Python lock. */ @@ -1302,6 +1307,8 @@ done: return 1; } +#endif + /* This is the main entry point for calling a Tcl command. It supports three cases, with regard to threading: 1. Tcl is not threaded: Must have the Tcl lock, then can invoke command in @@ -1531,9 +1538,11 @@ Tkapp_AddErrorInfo(PyObject *self, PyObject *args) /** Tcl Variable **/ +typedef PyObject* (*EventFunc)(PyObject*, PyObject *args, int flags); + +#ifdef WITH_THREAD TCL_DECLARE_MUTEX(var_mutex) -typedef PyObject* (*EventFunc)(PyObject*, PyObject *args, int flags); typedef struct VarEvent { Tcl_Event ev; /* must be first */ PyObject *self; @@ -1545,6 +1554,7 @@ typedef struct VarEvent { PyObject **exc_val; Tcl_Condition *cond; } VarEvent; +#endif static int varname_converter(PyObject *in, void *_out) @@ -1562,6 +1572,8 @@ varname_converter(PyObject *in, void *_out) return 0; } +#ifdef WITH_THREAD + static void var_perform(VarEvent *ev) { @@ -1589,11 +1601,13 @@ var_proc(VarEvent* ev, int flags) return 1; } +#endif + static PyObject* var_invoke(EventFunc func, PyObject *selfptr, PyObject *args, int flags) { - TkappObject *self = (TkappObject*)selfptr; #ifdef WITH_THREAD + TkappObject *self = (TkappObject*)selfptr; if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) { TkappObject *self = (TkappObject*)selfptr; VarEvent *ev; @@ -2096,6 +2110,7 @@ PythonCmdDelete(ClientData clientData) +#ifdef WITH_THREAD TCL_DECLARE_MUTEX(command_mutex) typedef struct CommandEvent{ @@ -2122,6 +2137,7 @@ Tkapp_CommandProc(CommandEvent *ev, int flags) Tcl_MutexUnlock(&command_mutex); return 1; } +#endif static PyObject * Tkapp_CreateCommand(PyObject *selfptr, PyObject *args) @@ -2152,7 +2168,8 @@ Tkapp_CreateCommand(PyObject *selfptr, PyObject *args) Py_INCREF(func); data->self = selfptr; data->func = func; - + +#ifdef WITH_THREAD if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) { Tcl_Condition cond = NULL; CommandEvent *ev = (CommandEvent*)ckalloc(sizeof(CommandEvent)); @@ -2166,7 +2183,9 @@ Tkapp_CreateCommand(PyObject *selfptr, PyObject *args) Tkapp_ThreadSend(self, (Tcl_Event*)ev, &cond, &command_mutex); Tcl_ConditionFinalize(&cond); } - else { + else +#endif + { ENTER_TCL err = Tcl_CreateCommand( Tkapp_Interp(self), cmdName, PythonCmd, @@ -2194,6 +2213,8 @@ Tkapp_DeleteCommand(PyObject *selfptr, PyObject *args) if (!PyArg_ParseTuple(args, "s:deletecommand", &cmdName)) return NULL; + +#ifdef WITH_THREAD if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) { Tcl_Condition cond = NULL; CommandEvent *ev; @@ -2208,7 +2229,9 @@ Tkapp_DeleteCommand(PyObject *selfptr, PyObject *args) &command_mutex); Tcl_ConditionFinalize(&cond); } - else { + else +#endif + { ENTER_TCL err = Tcl_DeleteCommand(self->interp, cmdName); LEAVE_TCL