Adjusted _tkinter to compile without warnings when WITH_THREAD is not

defined (part of issue #5035)
This commit is contained in:
Guilherme Polo 2009-03-27 21:43:08 +00:00
parent 7fa9459baf
commit 1972d16230
2 changed files with 32 additions and 6 deletions

View File

@ -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.

View File

@ -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