diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst index 94863e11203..7586035a92a 100644 --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -82,7 +82,7 @@ The variables defined in the :mod:`signal` module are: .. data:: ITIMER_REAL - Decrements interval timer in real time, and delivers SIGALRM upon expiration. + Decrements interval timer in real time, and delivers :const:`SIGALRM` upon expiration. .. data:: ITIMER_VIRTUAL @@ -143,12 +143,18 @@ The :mod:`signal` module defines the following functions: .. function:: setitimer(which, seconds[, interval]) - Sets given itimer (one of :const:`signal.ITIMER_REAL`, - :const:`signal.ITIMER_VIRTUAL` or :const:`signal.ITIMER_PROF`) especified + Sets given interval timer (one of :const:`signal.ITIMER_REAL`, + :const:`signal.ITIMER_VIRTUAL` or :const:`signal.ITIMER_PROF`) specified by *which* to fire after *seconds* (float is accepted, different from :func:`alarm`) and after that every *interval* seconds. The interval timer specified by *which* can be cleared by setting seconds to zero. + When an interval timer fires, a signal is sent to the process. + The signal sent is dependent on the timer being used; + :const:`signal.ITIMER_REAL` will deliver :const:`SIGALRM`, + :const:`signal.ITIMER_VIRTUAL` sends :const:`SIGVTALRM`, + and :const:`signal.ITIMER_PROF` will deliver :const:`SIGPROF`. + The old values are returned as a tuple: (delay, interval). Attempting to pass an invalid interval timer will cause a @@ -159,7 +165,7 @@ The :mod:`signal` module defines the following functions: .. function:: getitimer(which) - Returns current value of a given itimer especified by *which*. + Returns current value of a given interval timer specified by *which*. .. versionadded:: 2.6 diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index 9299c016c4e..26f51690e2b 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -133,8 +133,11 @@ The infrastructure committee of the Python Software Foundation therefore posted a call for issue trackers, asking volunteers to set up different products and import some of the bugs and patches from SourceForge. Four different trackers were examined: Atlassian's `Jira -`__, `Launchpad `__, ` `Roundup -`__, and Trac `__. The committee eventually settled on Jira +`__, +`Launchpad `__, +`Roundup `__, and +Trac `__. +The committee eventually settled on Jira and Roundup as the two candidates. Jira is a commercial product that offers a no-cost hosted instance to free-software projects; Roundup is an open-source project that requires volunteers @@ -146,19 +149,18 @@ host multiple trackers, and this server now also hosts issue trackers for Jython and for the Python web site. It will surely find other uses in the future. -Hosting is kindly provided by `Upfront `__ of XXX. Martin von -Loewis put a lot of effort into importing existing bugs and patches -from SourceForge; his scripts for this import are at XXX. +Hosting is kindly provided by `Upfront Systems `__ of Stellenbosch, South Africa. Martin von Loewis put a +lot of effort into importing existing bugs and patches from +SourceForge; his scripts for this import operation are at +http://svn.python.org/view/tracker/importer/. .. seealso:: - XXX Roundup web site. + http://bugs.python.org: The Python bug tracker. - bugs.python.org + http://bugs.jython.org: The Jython bug tracker. - bugs.jython.org - - Python web site bug tracker + http://roundup.sourceforge.net/: Roundup downloads and documentation. New Documentation Format: ReStructured Text @@ -728,6 +730,21 @@ and it also supports the ``b''`` notation. .. ====================================================================== +.. _pep-3116: + +PEP 3116: New I/O Library +===================================================== + +XXX write this. + +.. seealso:: + + :pep:`3116` - New I/O + PEP written by Daniel Stutzbach, Mike Verdone, and Guido van Rossum. + XXX code written by who? + +.. ====================================================================== + .. _pep-3118: PEP 3118: Revised Buffer Protocol @@ -895,8 +912,9 @@ one, :func:`math.trunc`, that's been backported to Python 2.6. :pep:`3141` - A Type Hierarchy for Numbers PEP written by Jeffrey Yasskin. - XXX link: Discusses Scheme's numeric tower. + `Scheme's numerical tower `__, from the Guile manual. + `Scheme's number datatypes `__ from the R5RS Scheme specification. The :mod:`fractions` Module @@ -1229,7 +1247,7 @@ complete list of changes, or look through the CVS logs for all the details. * The :mod:`datetime` module's :meth:`strftime` methods now support a ``%f`` format code that expands to the number of microseconds in the object, zero-padded on - the left to six places. (Contributed by XXX.) + the left to six places. (Contributed by Skip Montanaro.) .. Patch 1158 @@ -1527,7 +1545,8 @@ complete list of changes, or look through the CVS logs for all the details. numbers following a triangular distribution. The returned values are between *low* and *high*, not including *high* itself, and with *mode* as the mode, the most frequently occurring value - in the distribution. (Contributed by Raymond Hettinger. XXX check) + in the distribution. (Contributed by Wladmir van der Laan and + Raymond Hettinger.) .. Patch 1681432 @@ -1544,7 +1563,7 @@ complete list of changes, or look through the CVS logs for all the details. have a read-only :attr:`queue` attribute that returns the contents of the scheduler's queue, represented as a list of named tuples with the fields ``(time, priority, action, argument)``. - (Contributed by Raymond Hettinger XXX check.) + (Contributed by Raymond Hettinger.) .. Patch 1861 @@ -1554,7 +1573,7 @@ complete list of changes, or look through the CVS logs for all the details. objects; ``pollobj.modify(fd, eventmask)`` takes a file descriptor or file object and an event mask, - (Contributed by XXX.) + (Contributed by Christian Heimes.) .. Patch 1657 @@ -1571,7 +1590,7 @@ complete list of changes, or look through the CVS logs for all the details. :cfunc:`PySignal_SetWakeupFd`, for setting the descriptor. Event loops will use this by opening a pipe to create two descriptors, - one for reading and one for writing. The writeable descriptor + one for reading and one for writing. The writable descriptor will be passed to :func:`set_wakeup_fd`, and the readable descriptor will be added to the list of descriptors monitored by the event loop via :cfunc:`select` or :cfunc:`poll`. @@ -1586,6 +1605,16 @@ complete list of changes, or look through the CVS logs for all the details. and allows changing whether signals can interrupt system calls or not. (Contributed by Ralf Schmitt.) + The :func:`setitimer` and :func:`getitimer` functions have also been + added on systems that support these system calls. :func:`setitimer` + allows setting interval timers that will cause a signal to be + delivered to the process after a specified time, measured in + wall-clock time, consumed process time, or combined process+system + time. (Contributed by Guilherme Polo.) + + .. Patch 2240 + + * The :mod:`smtplib` module now supports SMTP over SSL thanks to the addition of the :class:`SMTP_SSL` class. This class supports an interface identical to the existing :class:`SMTP` class. Both diff --git a/Lib/distutils/core.py b/Lib/distutils/core.py index 0490e6378bd..a4c5e18033b 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 00000000000..8e274dd40da --- /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 da5bd21d080..0b6193b25c8 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 8c12f5763bc..a410710f270 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 3508bfc3a95..1017f565982 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 8661cde9ca6..be97807118b 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: diff --git a/Tools/buildbot/buildmsi.bat b/Tools/buildbot/buildmsi.bat index 962df6638f9..5625d659317 100644 --- a/Tools/buildbot/buildmsi.bat +++ b/Tools/buildbot/buildmsi.bat @@ -3,9 +3,6 @@ cmd /c Tools\buildbot\external.bat @rem build release versions of things call "%VS90COMNTOOLS%vsvars32.bat" -if not exist ..\db-4.4.20\build_win32\release\libdb44s.lib ( - vcbuild db-4.4.20\build_win32\Berkeley_DB.sln /build Release /project db_static -) @rem build Python vcbuild /useenv PCbuild\pcbuild.sln "Release|Win32"