I spent the last couple of days hunting for the bug in MacPython threaded import, but it turned out the bug is in the test harness. (I did find another serious bug in the process, so the time wasn't wasted, but still) The problem is that test_threaded_import cannot run inside an "import". It knows this, and so does regrtest, so they run the test after the import by calling test_threaded_import.test_main(), which does the actual test. All good and fine if you run regrtest as a main script from the commandline, but of course it breaks if you run autotest, or if you "import regrtest" in an interactive window, because in these cases the import in the main thread already holds the lock. I can simply add an "if not verbose", as in test_socketserver, but that isn't really the problem. Does anyone know a better solution? -- Jack Jansen | ++++ stop the execution of Mumia Abu-Jamal ++++ Jack.Jansen@oratrix.com | ++++ if you agree copy these lines to your sig ++++ www.cwi.nl/~jack | ++++ see http://www.xs4all.nl/~tank/ ++++
[Jack Jansen]
I spent the last couple of days hunting for the bug in MacPython threaded import, but it turned out the bug is in the test harness. (I did find another serious bug in the process, so the time wasn't wasted, but still)
Hmm! You originally said this test hung "about 30% of the time", and didn't respond when I asked how you ran it. Given the way you are running it, it should have hung 100% of the time. So something here is still muddy.
The problem is that test_threaded_import cannot run inside an "import". It knows this, and so does regrtest, so they run the test after the import by calling test_threaded_import.test_main(), which does the actual test.
All good and fine if you run regrtest as a main script from the commandline,
Or if you run test_threaded_import directly (leaving regrtest out of it).
but of course it breaks if you run autotest,
So it does! I've never done that.
or if you "import regrtest" in an interactive window,
Are you sure about that? Works fine for me, and should work fine.
because in these cases the import in the main thread already holds the lock.
It shouldn't hurt anything to import regrtest -- it's not until regrtest.main() gets invoked that a problem can occur.
I can simply add an "if not verbose", as in test_socketserver, but that isn't really the problem. Does anyone know a better solution?
I don't like that either -- test_socketserver almost never gets run on my box simply because it's an oddball. For the same reason I'm sure the test_exceptions part of test_math never gets run on anyone's box. Assuming you were suffering an illusion when saying "import regrest in an interactive window" doesn't work, I'd be content to special-case the snot out of autotest, like so: Index: test_threaded_import.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_threaded_import.py,v retrieving revision 1.2 diff -c -r1.2 test_threaded_import.py *** test_threaded_import.py 2001/05/22 18:28:25 1.2 --- test_threaded_import.py 2001/08/29 18:53:38 *************** *** 6,12 **** # randrange, and then Python hangs. import thread ! from test_support import verbose critical_section = thread.allocate_lock() done = thread.allocate_lock() --- 6,12 ---- # randrange, and then Python hangs. import thread ! from test_support import verbose, TestSkipped critical_section = thread.allocate_lock() done = thread.allocate_lock() *************** *** 32,37 **** --- 32,41 ---- def test_main(): # magic name! see above global N, done + import sys + for modname in sys.modules: + if modname.find('autotest') >= 0: + raise TestSkipped("can't run from autotest") done.acquire() for N in (20, 50) * 3: if verbose:
participants (2)
-
Jack Jansen
-
Tim Peters