[Python-checkins] r45724 - python/trunk/Modules/gcmodule.c

neal.norwitz python-checkins at python.org
Wed Apr 26 07:34:04 CEST 2006


Author: neal.norwitz
Date: Wed Apr 26 07:34:03 2006
New Revision: 45724

Modified:
   python/trunk/Modules/gcmodule.c
Log:
Patch from Aldo Cortesi (OpenBSD buildbot owner).

After the patch (45590) to add extra debug stats to the gc module, Python
was crashing on OpenBSD due to:
	Fatal Python error: Interpreter not initialized (version mismatch?)

This seems to occur due to calling collect() when initialized (in pythonrun.c)
is set to 0.  Now, the import will occur in the init function which
shouldn't suffer this problem.


Modified: python/trunk/Modules/gcmodule.c
==============================================================================
--- python/trunk/Modules/gcmodule.c	(original)
+++ python/trunk/Modules/gcmodule.c	Wed Apr 26 07:34:03 2006
@@ -75,6 +75,7 @@
 				DEBUG_OBJECTS | \
 				DEBUG_SAVEALL
 static int debug;
+static PyObject *tmod = NULL;
 
 /*--------------------------------------------------------------------------
 gc_refs values.
@@ -734,7 +735,6 @@
 	PyGC_Head unreachable; /* non-problematic unreachable trash */
 	PyGC_Head finalizers;  /* objects with, & reachable from, __del__ */
 	PyGC_Head *gc;
-	static PyObject *tmod = NULL;
 	double t1 = 0.0;
 
 	if (delstr == NULL) {
@@ -743,12 +743,6 @@
 			Py_FatalError("gc couldn't allocate \"__del__\"");
 	}
 
-	if (tmod == NULL) {
-		tmod = PyImport_ImportModule("time");
-		if (tmod == NULL)
-			PyErr_Clear();
-	}
-
 	if (debug & DEBUG_STATS) {
 		if (tmod != NULL) {
 			PyObject *f = PyObject_CallMethod(tmod, "time", NULL);
@@ -1233,6 +1227,19 @@
 	Py_INCREF(garbage);
 	if (PyModule_AddObject(m, "garbage", garbage) < 0)
 		return;
+
+	/* 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_ImportModule("time");
+		if (tmod == NULL)
+			PyErr_Clear();
+	}
+
 #define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return
 	ADD_INT(DEBUG_STATS);
 	ADD_INT(DEBUG_COLLECTABLE);


More information about the Python-checkins mailing list