[Python-checkins] cpython (merge default -> default): Merge

antoine.pitrou python-checkins at python.org
Wed Jan 18 02:08:28 CET 2012


http://hg.python.org/cpython/rev/12de1ad1cee8
changeset:   74478:12de1ad1cee8
parent:      74477:26b6732ecb87
parent:      74476:1de276420470
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Wed Jan 18 02:05:38 2012 +0100
summary:
  Merge

files:
  Doc/library/time.rst       |  12 ++++++
  Doc/library/webbrowser.rst |   7 ++-
  Doc/whatsnew/3.3.rst       |  12 +++--
  Lib/bz2.py                 |   8 +++-
  Lib/test/test_bz2.py       |   7 +++
  Lib/test/test_time.py      |   7 +++
  Misc/NEWS                  |   5 ++
  Modules/timemodule.c       |  47 ++++++++++++++++++++++++++
  8 files changed, 96 insertions(+), 9 deletions(-)


diff --git a/Doc/library/time.rst b/Doc/library/time.rst
--- a/Doc/library/time.rst
+++ b/Doc/library/time.rst
@@ -183,6 +183,18 @@
 
    .. 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
--- a/Doc/library/webbrowser.rst
+++ b/Doc/library/webbrowser.rst
@@ -164,12 +164,15 @@
 (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
--- a/Doc/whatsnew/3.3.rst
+++ b/Doc/whatsnew/3.3.rst
@@ -396,12 +396,14 @@
 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
--- a/Lib/bz2.py
+++ b/Lib/bz2.py
@@ -10,9 +10,13 @@
 __author__ = "Nadeem Vawda <nadeem.vawda at 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 @@
         """
         # 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
--- a/Lib/test/test_bz2.py
+++ b/Lib/test/test_bz2.py
@@ -463,6 +463,13 @@
             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
--- a/Lib/test/test_time.py
+++ b/Lib/test/test_time.py
@@ -332,6 +332,13 @@
         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
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -447,6 +447,11 @@
 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
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -737,6 +737,52 @@
 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 @@
 #ifdef HAVE_WORKING_TZSET
     {"tzset",           time_tzset, METH_NOARGS, tzset_doc},
 #endif
+    {"wallclock",       time_wallclock, METH_NOARGS, wallclock_doc},
     {NULL,              NULL}           /* sentinel */
 };
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list