summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2006-03-21 03:58:41 (GMT)
committerTim Peters <tim.peters@gmail.com>2006-03-21 03:58:41 (GMT)
commit59b96c1029290822b7069634fce4628b19b2d4ca (patch)
treeddc6d1734285e2c68e80e9d849cf62f529b88cab /Lib/test
parent66760f87b51662d95a0d13226712d83a7ab049f8 (diff)
downloadcpython-59b96c1029290822b7069634fce4628b19b2d4ca.zip
cpython-59b96c1029290822b7069634fce4628b19b2d4ca.tar.gz
cpython-59b96c1029290822b7069634fce4628b19b2d4ca.tar.bz2
Try to repair at least one segfault on the Mac buildbot,
as diagnosed by Nick Coghlan. test_capi.py: A test module should never spawn a thread as a side effect of being imported. Because this one did, the segfault one of its thread tests caused didn't occur until a few tests after test_regrtest.py thought test_capi was finished. Repair that. Also join() the thread spawned at the end, so that test_capi is truly finished when regrtest reports that it's done. _testcapimodule.c test_thread_state(): this spawns a couple of non-threading.py threads, passing them a PyObject* argument, but did nothing to ensure that those threads finished before returning. As a result, the PyObject* _could_ (although this was unlikely) get decref'ed out of existence before the threads got around to using it. Added explicit synchronization (via a Python mutex) so that test_thread_state can reliably wait for its spawned threads to finish.
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_capi.py87
1 files changed, 47 insertions, 40 deletions
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index 1dd2461..cdd84bb 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -5,44 +5,51 @@ import sys
from test import test_support
import _testcapi
-for name in dir(_testcapi):
- if name.startswith('test_'):
- test = getattr(_testcapi, name)
+def test_main():
+
+ for name in dir(_testcapi):
+ if name.startswith('test_'):
+ test = getattr(_testcapi, name)
+ if test_support.verbose:
+ print "internal", name
+ try:
+ test()
+ except _testcapi.error:
+ raise test_support.TestFailed, sys.exc_info()[1]
+
+ # some extra thread-state tests driven via _testcapi
+ def TestThreadState():
+ import thread
+ import time
+
if test_support.verbose:
- print "internal", name
- try:
- test()
- except _testcapi.error:
- raise test_support.TestFailed, sys.exc_info()[1]
-
-# some extra thread-state tests driven via _testcapi
-def TestThreadState():
- import thread
- import time
-
- if test_support.verbose:
- print "auto-thread-state"
-
- idents = []
-
- def callback():
- idents.append(thread.get_ident())
-
- _testcapi._test_thread_state(callback)
- time.sleep(1)
- # Check our main thread is in the list exactly 3 times.
- if idents.count(thread.get_ident()) != 3:
- raise test_support.TestFailed, \
- "Couldn't find main thread correctly in the list"
-
-try:
- _testcapi._test_thread_state
- have_thread_state = True
-except AttributeError:
- have_thread_state = False
-
-if have_thread_state:
- TestThreadState()
- import threading
- t=threading.Thread(target=TestThreadState)
- t.start()
+ print "auto-thread-state"
+
+ idents = []
+
+ def callback():
+ idents.append(thread.get_ident())
+
+ _testcapi._test_thread_state(callback)
+ a = b = callback
+ time.sleep(1)
+ # Check our main thread is in the list exactly 3 times.
+ if idents.count(thread.get_ident()) != 3:
+ raise test_support.TestFailed, \
+ "Couldn't find main thread correctly in the list"
+
+ try:
+ _testcapi._test_thread_state
+ have_thread_state = True
+ except AttributeError:
+ have_thread_state = False
+
+ if have_thread_state:
+ TestThreadState()
+ import threading
+ t=threading.Thread(target=TestThreadState)
+ t.start()
+ t.join()
+
+if __name__ == "__main__":
+ test_main()