[Python-checkins] cpython: Issue #21555: simplify code in gcmodule.c by using the pytime.h functions

antoine.pitrou python-checkins at python.org
Sat May 24 19:22:01 CEST 2014


http://hg.python.org/cpython/rev/d151ee749f5a
changeset:   90814:d151ee749f5a
parent:      90812:e5d963cb6afc
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Sat May 24 19:21:53 2014 +0200
summary:
  Issue #21555: simplify code in gcmodule.c by using the pytime.h functions instead of trying to call time.time() via the C API.
Patch by Geoffrey Spear.

files:
  Misc/ACKS          |   1 +
  Modules/gcmodule.c |  50 ++++++---------------------------
  2 files changed, 10 insertions(+), 41 deletions(-)


diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1250,6 +1250,7 @@
 Evgeny Sologubov
 Cody Somerville
 Edoardo Spadolini
+Geoffrey Spear
 Clay Spence
 Stefan Sperling
 Nicholas Spies
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
--- a/Modules/gcmodule.c
+++ b/Modules/gcmodule.c
@@ -25,6 +25,7 @@
 
 #include "Python.h"
 #include "frameobject.h"        /* for PyFrame_ClearFreeList */
+#include "pytime.h"           /* for _PyTime_gettimeofday, _PyTime_INTERVAL */
 
 /* Get an object's GC head */
 #define AS_GC(o) ((PyGC_Head *)(o)-1)
@@ -166,7 +167,6 @@
                 DEBUG_UNCOLLECTABLE | \
                 DEBUG_SAVEALL
 static int debug;
-static PyObject *tmod = NULL;
 
 /* Running stats per generation */
 struct gc_generation_stats {
@@ -894,26 +894,6 @@
     (void)PySet_ClearFreeList();
 }
 
-static double
-get_time(void)
-{
-    double result = 0;
-    if (tmod != NULL) {
-        _Py_IDENTIFIER(time);
-
-        PyObject *f = _PyObject_CallMethodId(tmod, &PyId_time, NULL);
-        if (f == NULL) {
-            PyErr_Clear();
-        }
-        else {
-            if (PyFloat_Check(f))
-                result = PyFloat_AsDouble(f);
-            Py_DECREF(f);
-        }
-    }
-    return result;
-}
-
 /* This is the main function.  Read this to understand how the
  * collection process works. */
 static Py_ssize_t
@@ -928,7 +908,8 @@
     PyGC_Head unreachable; /* non-problematic unreachable trash */
     PyGC_Head finalizers;  /* objects with, & reachable from, __del__ */
     PyGC_Head *gc;
-    double t1 = 0.0;
+    _PyTime_timeval t1;
+
     struct gc_generation_stats *stats = &generation_stats[generation];
 
     if (debug & DEBUG_STATS) {
@@ -938,7 +919,8 @@
         for (i = 0; i < NUM_GENERATIONS; i++)
             PySys_WriteStderr(" %" PY_FORMAT_SIZE_T "d",
                               gc_list_size(GEN_HEAD(i)));
-        t1 = get_time();
+        _PyTime_gettimeofday(&t1);
+
         PySys_WriteStderr("\n");
     }
 
@@ -1042,7 +1024,9 @@
             debug_cycle("uncollectable", FROM_GC(gc));
     }
     if (debug & DEBUG_STATS) {
-        double t2 = get_time();
+        _PyTime_timeval t2;
+        _PyTime_gettimeofday(&t2);
+
         if (m == 0 && n == 0)
             PySys_WriteStderr("gc: done");
         else
@@ -1051,10 +1035,7 @@
                 "%" PY_FORMAT_SIZE_T "d unreachable, "
                 "%" PY_FORMAT_SIZE_T "d uncollectable",
                 n+m, n);
-        if (t1 && t2) {
-            PySys_WriteStderr(", %.4fs elapsed", t2-t1);
-        }
-        PySys_WriteStderr(".\n");
+        PySys_WriteStderr(", %.4fs elapsed\n", _PyTime_INTERVAL(t1, t2));
     }
 
     /* Append instances in the uncollectable set to a Python
@@ -1581,18 +1562,6 @@
     if (PyModule_AddObject(m, "callbacks", callbacks) < 0)
         return NULL;
 
-    /* Importing can't be done in collect() because collect()
-     * can be called via PyGC_Collect() in Py_Finalize().
-     * This wouldn't be a problem, except that <initialized> is
-     * reset to 0 before calling collect which trips up
-     * the import and triggers an assertion.
-     */
-    if (tmod == NULL) {
-        tmod = PyImport_ImportModuleNoBlock("time");
-        if (tmod == NULL)
-            PyErr_Clear();
-    }
-
 #define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return NULL
     ADD_INT(DEBUG_STATS);
     ADD_INT(DEBUG_COLLECTABLE);
@@ -1681,7 +1650,6 @@
 _PyGC_Fini(void)
 {
     Py_CLEAR(callbacks);
-    Py_CLEAR(tmod);
 }
 
 /* for debugging */

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


More information about the Python-checkins mailing list