summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorNeal Norwitz <nnorwitz@gmail.com>2008-04-05 04:47:45 (GMT)
committerNeal Norwitz <nnorwitz@gmail.com>2008-04-05 04:47:45 (GMT)
commitf5c7c2eeca4c146fac28104ca91843cf3c8d640e (patch)
tree94893c3f5e7fa29ef58a342b7b37ef6b98d2abfb /Lib
parent9ed77358d618e4c65fbe5df67a87618be29fc391 (diff)
downloadcpython-f5c7c2eeca4c146fac28104ca91843cf3c8d640e.zip
cpython-f5c7c2eeca4c146fac28104ca91843cf3c8d640e.tar.gz
cpython-f5c7c2eeca4c146fac28104ca91843cf3c8d640e.tar.bz2
Merged revisions 61440-61441,61443,61445-61448,61451-61452,61455-61457,61459-61464,61466-61467,61469-61470,61476-61477,61479,61481-61482,61485,61487,61490,61493-61494,61497,61499-61502,61505-61506,61508,61511-61514,61519,61521-61522,61530-61531,61533-61537,61541-61555,61557-61558,61561-61562,61566-61569,61572-61574,61578-61579,61583-61584,61588-61589,61592,61594,61598-61601,61603-61604,61607-61612,61617,61619-61620,61624,61626,61628-61630,61635-61638,61640-61643,61645,61648,61653-61655,61659-61662,61664,61666,61668-61671,61673,61675,61679-61680,61682,61685-61686,61689-61695,61697-61699,61701-61703,61706,61710,61713,61717,61723,61726-61730,61736,61738,61740,61742,61745-61752,61754-61760,61762-61764,61768,61770-61772,61774-61775,61784-61787,61789-61792,61794-61795,61797-61806,61808-61809,61811-61812,61814-61819,61824,61826-61833,61835-61840,61843-61845,61848,61850,61854-61862,61865-61866,61868,61872-61873,61876-61877,61883-61888,61890-61891,61893-61899,61901-61903,61905-61912,61914,61917,61920-61921,61927,61930,61932-61934,61939,61941-61942,61944-61951,61955,61960-61963,61980,61982-61983,61991,61994-61996,62001-62003,62008-62010,62016-62017,62022,62024,62027,62031-62034,62041,62045-62046,62055-62058,62060-62066,62068-62074,62076-62079,62081-62083,62086-62089,62092-62094,62098,62101,62104,62106-62109,62115-62122,62124-62125,62127-62128,62130,62132,62134-62137,62139-62142,62144,62146-62148,62150-62152,62155-62161 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r62127 | trent.nelson | 2008-04-03 08:39:17 -0700 (Thu, 03 Apr 2008) | 1 line Remove the building of Berkeley DB step; _bsddb44.vcproj takes care of this for us now. ........ r62136 | amaury.forgeotdarc | 2008-04-03 16:07:55 -0700 (Thu, 03 Apr 2008) | 9 lines #1733757: the interpreter would hang on shutdown, if the function set by sys.settrace calls threading.currentThread. The correction somewhat improves the code, but it was close. Many thanks to the "with" construct, which turns python code into C calls. I wonder if it is not better to sys.settrace(None) just after running the __main__ module and before finalization. ........ r62141 | jeffrey.yasskin | 2008-04-03 21:51:19 -0700 (Thu, 03 Apr 2008) | 5 lines Doh! os.read() raises an OSError, not an IOError when it's interrupted. And fix some flakiness in test_itimer_prof, which could detect that the timer had reached 0 before the signal arrived announcing that fact. ........ r62142 | fred.drake | 2008-04-03 22:41:30 -0700 (Thu, 03 Apr 2008) | 4 lines - Issue #2385: distutils.core.run_script() makes __file__ available, so the controlled environment will more closely mirror the typical script environment. This supports setup.py scripts that refer to data files. ........ r62147 | fred.drake | 2008-04-04 04:31:14 -0700 (Fri, 04 Apr 2008) | 6 lines my previous change did what I said it should not: it changed the current directory to the directory in which the setup.py script lived (which made __file__ wrong) fixed, with test that the script is run in the current directory of the caller ........ r62148 | fred.drake | 2008-04-04 04:38:51 -0700 (Fri, 04 Apr 2008) | 2 lines stupid, stupid, stupid! ........ r62150 | jeffrey.yasskin | 2008-04-04 09:48:19 -0700 (Fri, 04 Apr 2008) | 2 lines Oops again. EINTR is in errno, not signal. ........ r62158 | andrew.kuchling | 2008-04-04 19:42:20 -0700 (Fri, 04 Apr 2008) | 1 line Minor edits ........ r62159 | andrew.kuchling | 2008-04-04 19:47:07 -0700 (Fri, 04 Apr 2008) | 1 line Markup fix; explain what interval timers do; typo fix ........ r62160 | andrew.kuchling | 2008-04-04 20:38:39 -0700 (Fri, 04 Apr 2008) | 1 line Various edits ........ r62161 | neal.norwitz | 2008-04-04 21:26:31 -0700 (Fri, 04 Apr 2008) | 9 lines Prevent test_sqlite from hanging on older versions of sqlite. The problem is that when trying to do the second insert, sqlite seems to sleep for a very long time. Here is the output from strace: read(6, "SQLite format 3\0\4\0\1\1\0@ \0\0\0\1\0\0\0\0"..., 1024) = 1024 nanosleep({4294, 966296000}, <unfinished ...> I don't know which version this was fixed in, but 3.2.1 definitely fails. ........
Diffstat (limited to 'Lib')
-rw-r--r--Lib/distutils/core.py2
-rw-r--r--Lib/distutils/tests/test_core.py81
-rw-r--r--Lib/sqlite3/test/transactions.py8
-rw-r--r--Lib/test/test_signal.py9
-rw-r--r--Lib/test/test_threading.py29
-rw-r--r--Lib/threading.py15
6 files changed, 133 insertions, 11 deletions
diff --git a/Lib/distutils/core.py b/Lib/distutils/core.py
index 0490e63..a4c5e18 100644
--- a/Lib/distutils/core.py
+++ b/Lib/distutils/core.py
@@ -207,7 +207,7 @@ def run_setup (script_name, script_args=None, stop_after="run"):
_setup_stop_after = stop_after
save_argv = sys.argv
- g = {}
+ g = {'__file__': script_name}
l = {}
try:
try:
diff --git a/Lib/distutils/tests/test_core.py b/Lib/distutils/tests/test_core.py
new file mode 100644
index 0000000..8e274dd
--- /dev/null
+++ b/Lib/distutils/tests/test_core.py
@@ -0,0 +1,81 @@
+"""Tests for distutils.core."""
+
+import io
+import distutils.core
+import os
+import shutil
+import sys
+import test.test_support
+import unittest
+
+
+# setup script that uses __file__
+setup_using___file__ = """\
+
+__file__
+
+from distutils.core import setup
+setup()
+"""
+
+setup_prints_cwd = """\
+
+import os
+print(os.getcwd())
+
+from distutils.core import setup
+setup()
+"""
+
+
+class CoreTestCase(unittest.TestCase):
+
+ def setUp(self):
+ self.old_stdout = sys.stdout
+ self.cleanup_testfn()
+
+ def tearDown(self):
+ sys.stdout = self.old_stdout
+ self.cleanup_testfn()
+
+ def cleanup_testfn(self):
+ path = test.test_support.TESTFN
+ if os.path.isfile(path):
+ os.remove(path)
+ elif os.path.isdir(path):
+ shutil.rmtree(path)
+
+ def write_setup(self, text, path=test.test_support.TESTFN):
+ open(path, "w").write(text)
+ return path
+
+ def test_run_setup_provides_file(self):
+ # Make sure the script can use __file__; if that's missing, the test
+ # setup.py script will raise NameError.
+ distutils.core.run_setup(
+ self.write_setup(setup_using___file__))
+
+ def test_run_setup_uses_current_dir(self):
+ # This tests that the setup script is run with the current directory
+ # as it's own current directory; this was temporarily broken by a
+ # previous patch when TESTFN did not use the current directory.
+ sys.stdout = io.StringIO()
+ cwd = os.getcwd()
+
+ # Create a directory and write the setup.py file there:
+ os.mkdir(test.test_support.TESTFN)
+ setup_py = os.path.join(test.test_support.TESTFN, "setup.py")
+ distutils.core.run_setup(
+ self.write_setup(setup_prints_cwd, path=setup_py))
+
+ output = sys.stdout.getvalue()
+ if output.endswith("\n"):
+ output = output[:-1]
+ self.assertEqual(cwd, output)
+
+
+def test_suite():
+ return unittest.makeSuite(CoreTestCase)
+
+if __name__ == "__main__":
+ unittest.main(defaultTest="test_suite")
diff --git a/Lib/sqlite3/test/transactions.py b/Lib/sqlite3/test/transactions.py
index da5bd21..0b6193b 100644
--- a/Lib/sqlite3/test/transactions.py
+++ b/Lib/sqlite3/test/transactions.py
@@ -112,6 +112,10 @@ class TransactionTests(unittest.TestCase):
self.failUnlessEqual(len(res), 1)
def CheckRaiseTimeout(self):
+ if sqlite.sqlite_version_info < (3, 2, 2):
+ # This will fail (hang) on earlier versions of sqlite.
+ # Determine exact version it was fixed. 3.2.1 hangs.
+ return
self.cur1.execute("create table test(i)")
self.cur1.execute("insert into test(i) values (5)")
try:
@@ -127,6 +131,10 @@ class TransactionTests(unittest.TestCase):
This tests the improved concurrency with pysqlite 2.3.4. You needed
to roll back con2 before you could commit con1.
"""
+ if sqlite.sqlite_version_info < (3, 2, 2):
+ # This will fail (hang) on earlier versions of sqlite.
+ # Determine exact version it was fixed. 3.2.1 hangs.
+ return
self.cur1.execute("create table test(i)")
self.cur1.execute("insert into test(i) values (5)")
try:
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
index 8c12f57..a410710 100644
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -31,8 +31,8 @@ def exit_subprocess():
def ignoring_eintr(__func, *args, **kwargs):
try:
return __func(*args, **kwargs)
- except IOError as e:
- if e.errno != signal.EINTR:
+ except EnvironmentError as e:
+ if e.errno != errno.EINTR:
raise
return None
@@ -363,12 +363,15 @@ class ItimerTest(unittest.TestCase):
def test_itimer_prof(self):
self.itimer = signal.ITIMER_PROF
signal.signal(signal.SIGPROF, self.sig_prof)
- signal.setitimer(self.itimer, 0.2)
+ signal.setitimer(self.itimer, 0.2, 0.2)
for i in range(100000000):
if signal.getitimer(self.itimer) == (0.0, 0.0):
break # sig_prof handler stopped this itimer
+ # profiling itimer should be (0.0, 0.0) now
+ self.assertEquals(signal.getitimer(self.itimer), (0.0, 0.0))
+ # and the handler should have been called
self.assertEqual(self.hndl_called, True)
def test_main():
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index 3508bfc..1017f56 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -237,6 +237,35 @@ class ThreadTests(unittest.TestCase):
"""])
self.assertEqual(rc, 42)
+ def test_finalize_with_trace(self):
+ # Issue1733757
+ # Avoid a deadlock when sys.settrace steps into threading._shutdown
+ import subprocess
+ rc = subprocess.call([sys.executable, "-c", """if 1:
+ import sys, threading
+
+ # A deadlock-killer, to prevent the
+ # testsuite to hang forever
+ def killer():
+ import os, time
+ time.sleep(2)
+ print('program blocked; aborting')
+ os._exit(2)
+ t = threading.Thread(target=killer)
+ t.setDaemon(True)
+ t.start()
+
+ # This is the trace function
+ def func(frame, event, arg):
+ threading.currentThread()
+ return func
+
+ sys.settrace(func)
+ """])
+ self.failIf(rc == 2, "interpreted was blocked")
+ self.failUnless(rc == 0, "Unexpected error")
+
+
def test_enumerate_after_join(self):
# Try hard to trigger #1703448: a thread is still returned in
# threading.enumerate() after it has been join()ed.
diff --git a/Lib/threading.py b/Lib/threading.py
index 8661cde..be97807 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -577,15 +577,16 @@ class Thread(_Verbose):
# since it isn't if dummy_threading is *not* being used then don't
# hide the exception.
- _active_limbo_lock.acquire()
try:
- try:
+ with _active_limbo_lock:
del _active[_get_ident()]
- except KeyError:
- if 'dummy_threading' not in _sys.modules:
- raise
- finally:
- _active_limbo_lock.release()
+ # There must not be any python code between the previous line
+ # and after the lock is released. Otherwise a tracing function
+ # could try to acquire the lock again in the same thread, (in
+ # currentThread()), and would block.
+ except KeyError:
+ if 'dummy_threading' not in _sys.modules:
+ raise
def join(self, timeout=None):
if not self._initialized: