Adjusted _tkinter to compile without warnings when WITH_THREAD is not
defined (part of issue #5035)
This commit is contained in:
parent
7fa9459baf
commit
1972d16230
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
@ -2153,6 +2169,7 @@ Tkapp_CreateCommand(PyObject *selfptr, PyObject *args)
|
|||
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
|
||||
|
|
Loading…
Reference in New Issue