Issue 5122: test_tcl and test_ttk_guionly don't like each other (original) (raw)

Issue5122

Created on 2009-02-01 04:45 by gpolo, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Files
File name Uploaded Description Edit
dont_load_tk_in_tkintercreate.diff gpolo,2009-02-06 16:45
protect_tk_loading.diff gpolo,2009-02-07 19:27
Messages (17)
msg80901 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-02-01 04:45
Recently I've added this test named test_ttk_guionly, and I noticed some buildslaves went red, like amd64 gentoo trunk and x86 FreeBSD trunk (I though there were others for the reason I'm going to say next, but didn't found on a quick look). amd 64 gentoo trunk is failing with: . . test_ttk_guionly test_ttk_guionly skipped -- ttk not available: no display name and no $DISPLAY environment variable . . test_tcl remoteFailed: [Failure instance: Traceback (failure with no frames): twisted.internet.error.ConnectionLost: Connection to the other side was lost in a non-clean fashion. ] When it is not test_tcl, it is test_ttk_guionly. I tried duplicating the issue here by creating a buildmaster and a buildslave, used same options to build and to run tests, also tried enabling and disabling pty (I've found some old emails about problems involving pty), but couldn't duplicate it. So I followed a build on this buildslave "amd 64 gentoo trunk" and noticed it took a long time from the time it started running test_tcl till when the error appeared, which makes me imagine there is some problem regarding X server authorization. Now this is when I started checking how many other slaves were failing with the same error, and then I found this "x86 FreeBSD trunk" which failed with the following message: . . test_ttk_guionly test_ttk_guionly skipped -- ttk not available: can't find package tile . . test_tcl XIO: fatal IO error 9 (Bad file descriptor) on X server ":0.0" after 25 requests (23 known processed) with 1 events remaining. *** Error code 1 This second bot had DISPLAY set, while the first didn't (although its TERM is set to xterm). I wonder if the first error ends up being the same as this second one. I'm asking myself if test_ttk_guionly is so wrong that it should be disabled everywhere, and even if it gets disabled, what if in the future another test comes in and "conflicts" with test_tcl ?
msg81272 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-02-06 16:01
Eric, I noticed you said Fedora 6, so I checked which tcl/tk it includes and apparently it is 8.4.13, is that correct ? I tried using tcl/tk 8.4.13 and I managed to hang it too :) Try running test_tcl followed by test_ttk_guionly with regrtest.
msg81273 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2009-02-06 16:07
Yes, I have these installed: tcl-8.4.13-3.fc6 tcl-devel-8.4.13-3.fc6 tk-8.4.13-3.fc6 tk-devel-8.4.13-3.fc6 When I run "./python Lib/test/regrtest.py test_tcl test_ttk_guionly", it hangs.
msg81276 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-02-06 16:18
> When I run "./python Lib/test/regrtest.py test_tcl test_ttk_guionly", it > hangs. I have isolated it now: Traceback (most recent call last): File "", line 1, in File "/home/gpolo/python-dev/python-trunk/Lib/lib-tk/Tkinter.py", line 1649, in loadtk self.tk.loadtk() _tkinter.TclError: no display name and no $DISPLAY environment variable >>> Tkinter.Tk() hang! Very nice, much more "solvable" now after getting to know the tcl/tk version.
msg81279 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-02-06 16:32
After "I have isolated it now:", there should be this interactive session (but gmail ate it apparently): >>> import os >>> del os.environ['DISPLAY'] >>> import Tkinter >>> t = Tkinter.Tcl() >>> t.loadtk() Traceback (most recent call last): File "", line 1, in File "/home/gpolo/python-dev/python-trunk/Lib/lib-tk/Tkinter.py", line 1649, in loadtk self.tk.loadtk() _tkinter.TclError: no display name and no $DISPLAY environment variable >>> Tkinter.Tk() hang!
msg81280 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-02-06 16:45
Ok, I've found the cause of the problem and the patch attached should solve it but shouldn't be applied! This was just a quick fix I did to confirm what I expected, I will add something more correct later. _tkinter is aware of this deadlock that we are getting (see Tkapp_TkInit), but it is not collaborating to solve it. The problem is avoided if we always use "loadtk" in Tkinter.py instead of using "create" to load tk.
msg81290 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2009-02-06 18:21
The patch does solve the problem for me. It no longer hangs when running either: ./python Lib/test/regrtest.py test_tcl test_ttk_guionly or: ./python Lib/test/regrtest.py ------------- ... test_traceback test_transformer test_ttk_guionly test_ttk_guionly skipped -- ttk not available: Calling Tk_Init again after a previous call failed might deadlock test_ttk_textonly test_tuple ... ------------- Thanks for tracking this down.
msg81293 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-02-06 19:34
Here is a better patch, for some definition of better. It syncs the failed attempt to load tk that may occur in _tkinter.Tkapp_TkInit, _tkinter.Tcl_AppInit and tkappinit.Tcl_AppInit. And that is done only for tk < 8.4.14 now. Said that, I'm a bit worried about the (new macro) TK_VERSION_HEX in _tkinter and tkappinit, maybe it is time to add a _tkinter.h ?
msg81295 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-02-06 19:42
Any chance you can look at the proposed patch, Martin ? I found out that it was you who reported this deadlock back then, so you might want to review the patch.
msg81298 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2009-02-06 20:11
The second patch (checking_for_failed_tk_load.diff) also works for me.
msg81299 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-02-06 20:57
Found a place still out of sync, it is fixed on this new patch. To reproduce the problem with the previous patch try this: import os del os.environ['DISPLAY'] import Tkinter Tkinter.Tk() Tkinter.Tcl().loadtk() # should hang now (with a proper tk version)
msg81304 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2009-02-06 22:02
With the second patch installed, your code snippet does indeed hang for me. With the third patch installed, I get: [trunk]$ ./python Python 2.7a0 (trunk:69369M, Feb 6 2009, 14:59:32) [GCC 4.1.2 20070626 (Red Hat 4.1.2-13)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> del os.environ['DISPLAY'] >>> import Tkinter Tkinter.Tk() >>> Tkinter.Tk() Traceback (most recent call last): File "", line 1, in File "/root/python/trunk/Lib/lib-tk/Tkinter.py", line 1643, in __init__ self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use) _tkinter.TclError: no display name and no $DISPLAY environment variable >>> Tkinter.Tcl().loadtk() # should hang now (with a proper tk version) Traceback (most recent call last): File "", line 1, in File "/root/python/trunk/Lib/lib-tk/Tkinter.py", line 1649, in loadtk self.tk.loadtk() _tkinter.TclError: Calling Tk_Init again after a previous call failed might deadlock Which I assume is the expected behavior. Also with the third patch installed, the regrtest's all pass.
msg81308 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-02-06 22:16
> Eric Smith added the comment: > . > . > Which I assume is the expected behavior. Yes it is expected. > > Also with the third patch installed, the regrtest's all pass. > Very nice. And Eric, thanks for the patience and for testing them all.
msg81346 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-02-07 19:27
A bit cleaner patch.
msg81350 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2009-02-07 21:47
protect_tk_loading.diff works for me.
msg81486 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2009-02-09 20:38
The current patch (protect_tk_loading.diff) looks reasonable to me, and it solves my problem with the tests hanging. So I'd suggest you commit the patch, insofar it improves on the current situation. I'm not an expert in tk, however. So if you're looking for advice from someone knowledgeable on tk's inner workings, you'll need to get someone else involved.
msg81488 - (view) Author: Guilherme Polo (gpolo) * (Python committer) Date: 2009-02-09 20:55
Thanks Eric, committed in r69473.
History
Date User Action Args
2022-04-11 14:56:45 admin set github: 49372
2009-02-09 20:55:15 gpolo set status: open -> closedresolution: fixedmessages: +
2009-02-09 20:38:46 eric.smith set messages: +
2009-02-07 21:47:48 eric.smith set messages: +
2009-02-07 19:28:06 gpolo set files: - checking_for_failed_tk_load.diff
2009-02-07 19:28:01 gpolo set files: - checking_for_failed_tk_load-2.diff
2009-02-07 19:27:54 gpolo set files: + protect_tk_loading.diffmessages: +
2009-02-06 22:16:17 gpolo set messages: +
2009-02-06 22:02:29 eric.smith set messages: +
2009-02-06 20:57:42 gpolo set files: + checking_for_failed_tk_load-2.diffmessages: +
2009-02-06 20:11:13 eric.smith set messages: +
2009-02-06 19:42:16 gpolo set nosy: + loewismessages: +
2009-02-06 19:34:48 gpolo set files: + checking_for_failed_tk_load.diffmessages: +
2009-02-06 18:21:29 eric.smith set messages: +
2009-02-06 16:45:56 gpolo set files: + dont_load_tk_in_tkintercreate.diffkeywords: + patchmessages: +
2009-02-06 16:32:13 gpolo set messages: +
2009-02-06 16🔞01 gpolo set messages: +
2009-02-06 16:07:10 eric.smith set messages: +
2009-02-06 16:01:22 gpolo set messages: +
2009-02-06 15:46:53 eric.smith set nosy: + eric.smith
2009-02-01 04:45:08 gpolo create