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. ........
This commit is contained in:
parent
9ed77358d6
commit
f5c7c2eeca
|
@ -82,7 +82,7 @@ The variables defined in the :mod:`signal` module are:
|
||||||
|
|
||||||
.. data:: ITIMER_REAL
|
.. 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
|
.. data:: ITIMER_VIRTUAL
|
||||||
|
@ -143,12 +143,18 @@ The :mod:`signal` module defines the following functions:
|
||||||
|
|
||||||
.. function:: setitimer(which, seconds[, interval])
|
.. function:: setitimer(which, seconds[, interval])
|
||||||
|
|
||||||
Sets given itimer (one of :const:`signal.ITIMER_REAL`,
|
Sets given interval timer (one of :const:`signal.ITIMER_REAL`,
|
||||||
:const:`signal.ITIMER_VIRTUAL` or :const:`signal.ITIMER_PROF`) especified
|
:const:`signal.ITIMER_VIRTUAL` or :const:`signal.ITIMER_PROF`) specified
|
||||||
by *which* to fire after *seconds* (float is accepted, different from
|
by *which* to fire after *seconds* (float is accepted, different from
|
||||||
:func:`alarm`) and after that every *interval* seconds. The interval
|
:func:`alarm`) and after that every *interval* seconds. The interval
|
||||||
timer specified by *which* can be cleared by setting seconds to zero.
|
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).
|
The old values are returned as a tuple: (delay, interval).
|
||||||
|
|
||||||
Attempting to pass an invalid interval timer will cause a
|
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)
|
.. 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
|
.. versionadded:: 2.6
|
||||||
|
|
||||||
|
|
|
@ -133,8 +133,11 @@ The infrastructure committee of the Python Software Foundation
|
||||||
therefore posted a call for issue trackers, asking volunteers to set
|
therefore posted a call for issue trackers, asking volunteers to set
|
||||||
up different products and import some of the bugs and patches from
|
up different products and import some of the bugs and patches from
|
||||||
SourceForge. Four different trackers were examined: Atlassian's `Jira
|
SourceForge. Four different trackers were examined: Atlassian's `Jira
|
||||||
<XXX>`__, `Launchpad <http://www.launchpad.net>`__, ` `Roundup
|
<http://www.atlassian.com/software/jira/>`__,
|
||||||
<XXX>`__, and Trac <XXX>`__. The committee eventually settled on 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
|
and Roundup as the two candidates. Jira is a commercial product that
|
||||||
offers a no-cost hosted instance to free-software projects; Roundup
|
offers a no-cost hosted instance to free-software projects; Roundup
|
||||||
is an open-source project that requires volunteers
|
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
|
for Jython and for the Python web site. It will surely find
|
||||||
other uses in the future.
|
other uses in the future.
|
||||||
|
|
||||||
Hosting is kindly provided by `Upfront <XXX>`__ of XXX. Martin von
|
Hosting is kindly provided by `Upfront Systems <http://www.upfrontsystems.co.za/>`__ of Stellenbosch, South Africa. Martin von Loewis put a
|
||||||
Loewis put a lot of effort into importing existing bugs and patches
|
lot of effort into importing existing bugs and patches from
|
||||||
from SourceForge; his scripts for this import are at XXX.
|
SourceForge; his scripts for this import operation are at
|
||||||
|
http://svn.python.org/view/tracker/importer/.
|
||||||
|
|
||||||
.. seealso::
|
.. 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
|
http://roundup.sourceforge.net/: Roundup downloads and documentation.
|
||||||
|
|
||||||
Python web site bug tracker
|
|
||||||
|
|
||||||
|
|
||||||
New Documentation Format: ReStructured Text
|
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:
|
||||||
|
|
||||||
PEP 3118: Revised Buffer Protocol
|
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:`3141` - A Type Hierarchy for Numbers
|
||||||
PEP written by Jeffrey Yasskin.
|
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
|
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
|
* The :mod:`datetime` module's :meth:`strftime` methods now support a
|
||||||
``%f`` format code that expands to the number of microseconds in the
|
``%f`` format code that expands to the number of microseconds in the
|
||||||
object, zero-padded on
|
object, zero-padded on
|
||||||
the left to six places. (Contributed by XXX.)
|
the left to six places. (Contributed by Skip Montanaro.)
|
||||||
|
|
||||||
.. Patch 1158
|
.. 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
|
numbers following a triangular distribution. The returned values
|
||||||
are between *low* and *high*, not including *high* itself, and
|
are between *low* and *high*, not including *high* itself, and
|
||||||
with *mode* as the mode, the most frequently occurring value
|
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
|
.. 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
|
have a read-only :attr:`queue` attribute that returns the
|
||||||
contents of the scheduler's queue, represented as a list of
|
contents of the scheduler's queue, represented as a list of
|
||||||
named tuples with the fields ``(time, priority, action, argument)``.
|
named tuples with the fields ``(time, priority, action, argument)``.
|
||||||
(Contributed by Raymond Hettinger XXX check.)
|
(Contributed by Raymond Hettinger.)
|
||||||
|
|
||||||
.. Patch 1861
|
.. 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
|
objects; ``pollobj.modify(fd, eventmask)`` takes a file descriptor
|
||||||
or file object and an event mask,
|
or file object and an event mask,
|
||||||
|
|
||||||
(Contributed by XXX.)
|
(Contributed by Christian Heimes.)
|
||||||
|
|
||||||
.. Patch 1657
|
.. 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.
|
:cfunc:`PySignal_SetWakeupFd`, for setting the descriptor.
|
||||||
|
|
||||||
Event loops will use this by opening a pipe to create two descriptors,
|
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 passed to :func:`set_wakeup_fd`, and the readable descriptor
|
||||||
will be added to the list of descriptors monitored by the event loop via
|
will be added to the list of descriptors monitored by the event loop via
|
||||||
:cfunc:`select` or :cfunc:`poll`.
|
: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.
|
and allows changing whether signals can interrupt system calls or not.
|
||||||
(Contributed by Ralf Schmitt.)
|
(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
|
* The :mod:`smtplib` module now supports SMTP over SSL thanks to the
|
||||||
addition of the :class:`SMTP_SSL` class. This class supports an
|
addition of the :class:`SMTP_SSL` class. This class supports an
|
||||||
interface identical to the existing :class:`SMTP` class. Both
|
interface identical to the existing :class:`SMTP` class. Both
|
||||||
|
|
|
@ -207,7 +207,7 @@ def run_setup (script_name, script_args=None, stop_after="run"):
|
||||||
_setup_stop_after = stop_after
|
_setup_stop_after = stop_after
|
||||||
|
|
||||||
save_argv = sys.argv
|
save_argv = sys.argv
|
||||||
g = {}
|
g = {'__file__': script_name}
|
||||||
l = {}
|
l = {}
|
||||||
try:
|
try:
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -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")
|
|
@ -112,6 +112,10 @@ class TransactionTests(unittest.TestCase):
|
||||||
self.failUnlessEqual(len(res), 1)
|
self.failUnlessEqual(len(res), 1)
|
||||||
|
|
||||||
def CheckRaiseTimeout(self):
|
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("create table test(i)")
|
||||||
self.cur1.execute("insert into test(i) values (5)")
|
self.cur1.execute("insert into test(i) values (5)")
|
||||||
try:
|
try:
|
||||||
|
@ -127,6 +131,10 @@ class TransactionTests(unittest.TestCase):
|
||||||
This tests the improved concurrency with pysqlite 2.3.4. You needed
|
This tests the improved concurrency with pysqlite 2.3.4. You needed
|
||||||
to roll back con2 before you could commit con1.
|
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("create table test(i)")
|
||||||
self.cur1.execute("insert into test(i) values (5)")
|
self.cur1.execute("insert into test(i) values (5)")
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -31,8 +31,8 @@ def exit_subprocess():
|
||||||
def ignoring_eintr(__func, *args, **kwargs):
|
def ignoring_eintr(__func, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
return __func(*args, **kwargs)
|
return __func(*args, **kwargs)
|
||||||
except IOError as e:
|
except EnvironmentError as e:
|
||||||
if e.errno != signal.EINTR:
|
if e.errno != errno.EINTR:
|
||||||
raise
|
raise
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -363,12 +363,15 @@ class ItimerTest(unittest.TestCase):
|
||||||
def test_itimer_prof(self):
|
def test_itimer_prof(self):
|
||||||
self.itimer = signal.ITIMER_PROF
|
self.itimer = signal.ITIMER_PROF
|
||||||
signal.signal(signal.SIGPROF, self.sig_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):
|
for i in range(100000000):
|
||||||
if signal.getitimer(self.itimer) == (0.0, 0.0):
|
if signal.getitimer(self.itimer) == (0.0, 0.0):
|
||||||
break # sig_prof handler stopped this itimer
|
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)
|
self.assertEqual(self.hndl_called, True)
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
|
|
|
@ -237,6 +237,35 @@ class ThreadTests(unittest.TestCase):
|
||||||
"""])
|
"""])
|
||||||
self.assertEqual(rc, 42)
|
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):
|
def test_enumerate_after_join(self):
|
||||||
# Try hard to trigger #1703448: a thread is still returned in
|
# Try hard to trigger #1703448: a thread is still returned in
|
||||||
# threading.enumerate() after it has been join()ed.
|
# threading.enumerate() after it has been join()ed.
|
||||||
|
|
|
@ -577,15 +577,16 @@ class Thread(_Verbose):
|
||||||
# since it isn't if dummy_threading is *not* being used then don't
|
# since it isn't if dummy_threading is *not* being used then don't
|
||||||
# hide the exception.
|
# hide the exception.
|
||||||
|
|
||||||
_active_limbo_lock.acquire()
|
|
||||||
try:
|
try:
|
||||||
try:
|
with _active_limbo_lock:
|
||||||
del _active[_get_ident()]
|
del _active[_get_ident()]
|
||||||
except KeyError:
|
# There must not be any python code between the previous line
|
||||||
if 'dummy_threading' not in _sys.modules:
|
# and after the lock is released. Otherwise a tracing function
|
||||||
raise
|
# could try to acquire the lock again in the same thread, (in
|
||||||
finally:
|
# currentThread()), and would block.
|
||||||
_active_limbo_lock.release()
|
except KeyError:
|
||||||
|
if 'dummy_threading' not in _sys.modules:
|
||||||
|
raise
|
||||||
|
|
||||||
def join(self, timeout=None):
|
def join(self, timeout=None):
|
||||||
if not self._initialized:
|
if not self._initialized:
|
||||||
|
|
|
@ -3,9 +3,6 @@
|
||||||
cmd /c Tools\buildbot\external.bat
|
cmd /c Tools\buildbot\external.bat
|
||||||
@rem build release versions of things
|
@rem build release versions of things
|
||||||
call "%VS90COMNTOOLS%vsvars32.bat"
|
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
|
@rem build Python
|
||||||
vcbuild /useenv PCbuild\pcbuild.sln "Release|Win32"
|
vcbuild /useenv PCbuild\pcbuild.sln "Release|Win32"
|
||||||
|
|
Loading…
Reference in New Issue