@@ -210,12 +210,24 @@ static PyThreadState *tcl_tstate = NULL;
210210#endif
211211
212212#define ENTER_TCL \
213- { PyThreadState *tstate = PyThreadState_Get(); Py_BEGIN_ALLOW_THREADS \
214- if(tcl_lock)PyThread_acquire_lock(tcl_lock, 1); tcl_tstate = tstate;
213+ { PyThreadState *tstate = PyThreadState_Get();\
214+ ENTER_TCL_CUSTOM_TSTATE(tstate)
215+
216+ #define ENTER_TCL_CUSTOM_TSTATE (tstate ) \
217+ Py_BEGIN_ALLOW_THREADS\
218+ if (tcl_lock)PyThread_acquire_lock(tcl_lock, 1); tcl_tstate = tstate;
215219
216220#define LEAVE_TCL \
217221 tcl_tstate = NULL; if(tcl_lock)PyThread_release_lock(tcl_lock); Py_END_ALLOW_THREADS}
218222
223+ #define LEAVE_TCL_WITH_BUSYWAIT (result ) \
224+ tcl_tstate = NULL; \
225+ if (tcl_lock)PyThread_release_lock(tcl_lock);\
226+ if (result == 0)\
227+ Sleep(Tkinter_busywaitinterval);\
228+ Py_END_ALLOW_THREADS
229+
230+
219231#define ENTER_OVERLAP \
220232 Py_END_ALLOW_THREADS
221233
@@ -250,7 +262,9 @@ static PyThreadState *tcl_tstate = NULL;
250262#else
251263
252264#define ENTER_TCL
265+ #define ENTER_TCL_CUSTOM_TSTATE (tstate )
253266#define LEAVE_TCL
267+ #define LEAVE_TCL_WITH_BUSYWAIT (result )
254268#define ENTER_OVERLAP
255269#define LEAVE_OVERLAP
256270#define LEAVE_OVERLAP_TCL
@@ -3081,15 +3095,9 @@ Tkapp_MainLoop(PyObject *selfptr, PyObject *args)
30813095 LEAVE_TCL
30823096 }
30833097 else {
3084- Py_BEGIN_ALLOW_THREADS
3085- if (tcl_lock )PyThread_acquire_lock (tcl_lock , 1 );
3086- tcl_tstate = tstate ;
3098+ ENTER_TCL_CUSTOM_TSTATE (tstate )
30873099 result = Tcl_DoOneEvent (TCL_DONT_WAIT );
3088- tcl_tstate = NULL ;
3089- if (tcl_lock )PyThread_release_lock (tcl_lock );
3090- if (result == 0 )
3091- Sleep (Tkinter_busywaitinterval );
3092- Py_END_ALLOW_THREADS
3100+ LEAVE_TCL_WITH_BUSYWAIT (result )
30933101 }
30943102#else
30953103 result = Tcl_DoOneEvent (0 );
@@ -3595,17 +3603,11 @@ EventHook(void)
35953603 }
35963604#endif
35973605#if defined(WITH_THREAD ) || defined(MS_WINDOWS )
3598- Py_BEGIN_ALLOW_THREADS
3599- if (tcl_lock )PyThread_acquire_lock (tcl_lock , 1 );
3600- tcl_tstate = event_tstate ;
3606+ ENTER_TCL_CUSTOM_TSTATE (event_tstate )
36013607
36023608 result = Tcl_DoOneEvent (TCL_DONT_WAIT );
36033609
3604- tcl_tstate = NULL ;
3605- if (tcl_lock )PyThread_release_lock (tcl_lock );
3606- if (result == 0 )
3607- Sleep (Tkinter_busywaitinterval );
3608- Py_END_ALLOW_THREADS
3610+ LEAVE_TCL_WITH_BUSYWAIT (result )
36093611#else
36103612 result = Tcl_DoOneEvent (0 );
36113613#endif
0 commit comments