summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/time.rst12
-rw-r--r--Doc/library/webbrowser.rst7
-rw-r--r--Doc/whatsnew/3.3.rst12
-rw-r--r--Lib/bz2.py8
-rw-r--r--Lib/test/test_bz2.py7
-rw-r--r--Lib/test/test_time.py7
-rw-r--r--Misc/NEWS5
-rw-r--r--Modules/timemodule.c47
8 files changed, 96 insertions, 9 deletions
diff --git a/Doc/library/time.rst b/Doc/library/time.rst
index 668651a..757fbf3 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/library/webbrowser.rst b/Doc/library/webbrowser.rst
index 188647d..9cf8c50 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)
diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst
index a60e585..5bffd1e 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/bz2.py b/Lib/bz2.py
index 5c59a9e..36e5558 100644
--- a/Lib/bz2.py
+++ b/Lib/bz2.py
@@ -10,9 +10,13 @@ __all__ = ["BZ2File", "BZ2Compressor", "BZ2Decompressor", "compress",
__author__ = "Nadeem Vawda <nadeem.vawda@gmail.com>"
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 bd40f83..0f8d149 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/Lib/test/test_time.py b/Lib/test/test_time.py
index a73588c..ede85b7 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 8178a92..7894515 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -447,6 +447,11 @@ 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.
+
- Issue #13589: Fix some serialization primitives in the aifc module.
Patch by Oleg Plakhotnyuk.
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 46b8e9a..f7dac5b 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -737,6 +737,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
@@ -872,6 +918,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 */
};