summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/signal.rst14
-rw-r--r--Doc/whatsnew/2.6.rst61
-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
-rw-r--r--Tools/buildbot/buildmsi.bat3
9 files changed, 188 insertions, 34 deletions
diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst
index 94863e1..7586035 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 9299c01..26f5169 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
-<XXX>`__, `Launchpad <http://www.launchpad.net>`__, ` `Roundup
-<XXX>`__, and Trac <XXX>`__. The committee eventually settled on Jira
+<http://www.atlassian.com/software/jira/>`__,
+`Launchpad <http://www.launchpad.net>`__,
+`Roundup <http://roundup.sourceforge.net/>`__, and
+Trac <http://trac.edgewall.org/>`__.
+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 <XXX>`__ 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 <http://www.upfrontsystems.co.za/>`__ 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 <http://www.gnu.org/software/guile/manual/html_node/Numerical-Tower.html#Numerical-Tower>`__, from the Guile manual.
+ `Scheme's number datatypes <http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html#%_sec_6.2>`__ 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 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:
diff --git a/Tools/buildbot/buildmsi.bat b/Tools/buildbot/buildmsi.bat
index 962df66..5625d65 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"