From 72750a85f970dc7d79c44c63fd02157634984762 Mon Sep 17 00:00:00 2001 From: Nadeem Vawda Date: Wed, 18 Jan 2012 01:57:14 +0200 Subject: [PATCH 1/4] Issue #13809: Make bz2 module work with threads disabled. Original patch by Amaury Forgeot d'Arc. --- Lib/bz2.py | 8 ++++++-- Lib/test/test_bz2.py | 7 +++++++ Misc/NEWS | 3 +++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Lib/bz2.py b/Lib/bz2.py index 5c59a9e08a4..36e55584ed7 100644 --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -10,9 +10,13 @@ __all__ = ["BZ2File", "BZ2Compressor", "BZ2Decompressor", "compress", __author__ = "Nadeem Vawda " import io -import threading import warnings +try: + from threading import RLock +except ImportError: + from dummy_threading import RLock + from _bz2 import BZ2Compressor, BZ2Decompressor @@ -53,7 +57,7 @@ class BZ2File(io.BufferedIOBase): """ # This lock must be recursive, so that BufferedIOBase's # readline(), readlines() and writelines() don't deadlock. - self._lock = threading.RLock() + self._lock = RLock() self._fp = None self._closefp = False self._mode = _MODE_CLOSED diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index bd40f83fcf6..0f8d14910f4 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -463,6 +463,13 @@ class BZ2FileTest(BaseTest): for t in threads: t.join() + def testWithoutThreading(self): + bz2 = support.import_fresh_module("bz2", blocked=("threading",)) + with bz2.BZ2File(self.filename, "wb") as f: + f.write(b"abc") + with bz2.BZ2File(self.filename, "rb") as f: + self.assertEqual(f.read(), b"abc") + def testMixedIterationAndReads(self): self.createTempFile() linelen = len(self.TEXT_LINES[0]) diff --git a/Misc/NEWS b/Misc/NEWS index 8178a92b89d..246b3c1977e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -447,6 +447,9 @@ Core and Builtins Library ------- +- Issue #13809: Fix regression where bz2 module wouldn't work when threads are + disabled. Original patch by Amaury Forgeot d'Arc. + - Issue #13589: Fix some serialization primitives in the aifc module. Patch by Oleg Plakhotnyuk. From 25d1bdc4074a93f268e40be1a8e49f003c3cbe57 Mon Sep 17 00:00:00 2001 From: Ezio Melotti Date: Wed, 18 Jan 2012 02:32:07 +0200 Subject: [PATCH 2/4] Add missing versionadded in webbrowser doc. --- Doc/library/webbrowser.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Doc/library/webbrowser.rst b/Doc/library/webbrowser.rst index 188647d0ce2..9cf8c504cc2 100644 --- a/Doc/library/webbrowser.rst +++ b/Doc/library/webbrowser.rst @@ -164,12 +164,15 @@ Notes: (4) Only on Mac OS X platform. +.. versionadded:: 3.3 + Support for Chrome/Chromium has been added. + Here are some simple examples:: - url = 'http://www.python.org/' + url = 'http://docs.python.org/' # Open URL in a new tab, if a browser window is already open. - webbrowser.open_new_tab(url + 'doc/') + webbrowser.open_new_tab(url) # Open URL in new window, raising the window if possible. webbrowser.open_new(url) From b94b266cfc94491eef206c082ff210d147016cbc Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 18 Jan 2012 01:50:21 +0100 Subject: [PATCH 3/4] Close #10278: Add time.wallclock() function, monotonic clock. --- Doc/library/time.rst | 12 +++++++++++ Doc/whatsnew/3.3.rst | 12 ++++++----- Lib/test/test_time.py | 7 +++++++ Misc/NEWS | 2 ++ Modules/timemodule.c | 47 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 5 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 668651a3302..757fbf3398e 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -183,6 +183,18 @@ The module defines the following functions and data items: .. versionadded:: 3.3 +.. function:: wallclock() + + .. index:: + single: Wallclock + single: benchmarking + + Return the current time in fractions of a second to the system's best ability. + Use this when the most accurate representation of wall-clock is required, i.e. + when "processor time" is inappropriate. The reference point of the returned + value is undefined so only the difference of consecutive calls is valid. + + .. versionadded: 3.3 .. function:: ctime([secs]) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst index a60e585622c..5bffd1eb1fc 100644 --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -396,12 +396,14 @@ New module: :mod:`faulthandler`. time ---- -* The :mod:`time` module has new :func:`~time.clock_getres` and - :func:`~time.clock_gettime` functions and ``CLOCK_xxx`` constants. - :func:`~time.clock_gettime` can be used with :data:`time.CLOCK_MONOTONIC` to - get a monotonic clock. +The :mod:`time` module has new functions: - (Contributed by Victor Stinner in :issue:`10278`) +* :func:`~time.clock_getres` and :func:`~time.clock_gettime` functions and + ``CLOCK_xxx`` constants. :func:`~time.clock_gettime` can be used with + :data:`time.CLOCK_MONOTONIC` to get a monotonic clock. +* :func:`~time.wallclock`: monotonic clock. + +(Contributed by Victor Stinner in :issue:`10278`) ftplib diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py index a73588cfcad..ede85b74b48 100644 --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -332,6 +332,13 @@ class TimeTestCase(unittest.TestCase): self.assertEqual(time.strftime('%Z', tt), tzname) + def test_wallclock(self): + t0 = time.wallclock() + time.sleep(0.1) + t1 = time.wallclock() + t = t1 - t0 + self.assertAlmostEqual(t, 0.1, places=2) + class TestLocale(unittest.TestCase): def setUp(self): self.oldloc = locale.setlocale(locale.LC_ALL) diff --git a/Misc/NEWS b/Misc/NEWS index 246b3c1977e..78945151f24 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -447,6 +447,8 @@ Core and Builtins Library ------- +- Issue #10278: Add time.wallclock() function, monotonic clock. + - Issue #13809: Fix regression where bz2 module wouldn't work when threads are disabled. Original patch by Amaury Forgeot d'Arc. diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 89a41ceb0f6..b6972aec79e 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -733,6 +733,52 @@ the local timezone used by methods such as localtime, but this behaviour\n\ should not be relied on."); #endif /* HAVE_WORKING_TZSET */ +static PyObject * +time_wallclock(PyObject *self, PyObject *unused) +{ +#if defined(MS_WINDOWS) && !defined(__BORLANDC__) + return time_clock(self, NULL); +#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) + static int clk_index = 0; + clockid_t clk_ids[] = { +#ifdef CLOCK_MONOTONIC_RAW + CLOCK_MONOTONIC_RAW, +#endif + CLOCK_MONOTONIC +#ifdef CLOCK_REALTIME + /* On Linux, CLOCK_REALTIME uses the same clock than gettimeofday(), + but clock_gettime() has a nanosecond resolution. */ + , CLOCK_REALTIME +#endif + }; + int ret; + struct timespec tp; + + while (0 <= clk_index) { + clockid_t clk_id = clk_ids[clk_index]; + ret = clock_gettime(clk_id, &tp); + if (ret == 0) + return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); + + clk_index++; + if (Py_ARRAY_LENGTH(clk_ids) <= clk_index) + clk_index = -1; + } + return time_time(self, NULL); +#else + return time_time(self, NULL); +#endif +} + +PyDoc_STRVAR(wallclock_doc, +"wallclock() -> float\n\ +\n\ +Return the current time in fractions of a second to the system's best\n\ +ability. Use this when the most accurate representation of wall-clock is\n\ +required, i.e. when "processor time" is inappropriate. The reference point\n\ +of the returned value is undefined so only the difference of consecutive\n\ +calls is valid."); + static void PyInit_timezone(PyObject *m) { /* This code moved from PyInit_time wholesale to allow calling it from @@ -868,6 +914,7 @@ static PyMethodDef time_methods[] = { #ifdef HAVE_WORKING_TZSET {"tzset", time_tzset, METH_NOARGS, tzset_doc}, #endif + {"wallclock", time_wallclock, METH_NOARGS, wallclock_doc}, {NULL, NULL} /* sentinel */ }; From 855889b4bf4478cc359fb1354ab5bbb99a7829aa Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 18 Jan 2012 01:57:19 +0100 Subject: [PATCH 4/4] Issue #10278: fix a typo in the doc --- Modules/timemodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/timemodule.c b/Modules/timemodule.c index b6972aec79e..8fa115c123d 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -775,7 +775,7 @@ PyDoc_STRVAR(wallclock_doc, \n\ Return the current time in fractions of a second to the system's best\n\ ability. Use this when the most accurate representation of wall-clock is\n\ -required, i.e. when "processor time" is inappropriate. The reference point\n\ +required, i.e. when \"processor time\" is inappropriate. The reference point\n\ of the returned value is undefined so only the difference of consecutive\n\ calls is valid.");