[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40401] trunk/blender/source/blender/ python/intern:

Campbell Barton ideasman42 at gmail.com
Tue Sep 20 17:17:26 CEST 2011


Revision: 40401
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40401
Author:   campbellbarton
Date:     2011-09-20 15:17:24 +0000 (Tue, 20 Sep 2011)
Log Message:
-----------


Modified Paths:
--------------
    trunk/blender/source/blender/python/intern/bpy.h
    trunk/blender/source/blender/python/intern/bpy_interface.c
    trunk/blender/source/blender/python/intern/bpy_interface_atexit.c

Modified: trunk/blender/source/blender/python/intern/bpy.h
===================================================================
--- trunk/blender/source/blender/python/intern/bpy.h	2011-09-20 15:11:17 UTC (rev 40400)
+++ trunk/blender/source/blender/python/intern/bpy.h	2011-09-20 15:17:24 UTC (rev 40401)
@@ -30,4 +30,5 @@
 extern PyObject *bpy_package_py;
 
 /* bpy_interface_atexit.c */
-void BPY_atexit_init(void);
+void BPY_atexit_register(void);
+void BPY_atexit_unregister(void);

Modified: trunk/blender/source/blender/python/intern/bpy_interface.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_interface.c	2011-09-20 15:11:17 UTC (rev 40400)
+++ trunk/blender/source/blender/python/intern/bpy_interface.c	2011-09-20 15:17:24 UTC (rev 40401)
@@ -241,7 +241,7 @@
 	
 	pyrna_alloc_types();
 
-	BPY_atexit_init(); /* this can init any time */
+	BPY_atexit_register(); /* this can init any time */
 
 #ifndef WITH_PYTHON_MODULE
 	py_tstate= PyGILState_GetThisThreadState();
@@ -262,6 +262,8 @@
 
 	bpy_intern_string_exit();
 
+	BPY_atexit_unregister(); /* without this we get recursive calls to WM_exit */
+
 	Py_Finalize();
 	
 #ifdef TIME_PY_RUN

Modified: trunk/blender/source/blender/python/intern/bpy_interface_atexit.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_interface_atexit.c	2011-09-20 15:11:17 UTC (rev 40400)
+++ trunk/blender/source/blender/python/intern/bpy_interface_atexit.c	2011-09-20 15:17:24 UTC (rev 40401)
@@ -46,24 +46,26 @@
 }
 
 static PyMethodDef meth_bpy_atexit= {"bpy_atexit", (PyCFunction)bpy_atexit, METH_NOARGS, NULL};
+static PyObject *func_bpy_atregister= NULL; /* borrowed referebce, atexit holds */
 
-void BPY_atexit_init(void)
+static void atexit_func_call(const char *func_name, PyObject *atexit_func_arg)
 {
 	/* note - no error checking, if any of these fail we'll get a crash
 	 * this is intended, but if its problematic it could be changed
 	 * - campbell */
 
 	PyObject *atexit_mod= PyImport_ImportModuleLevel((char *)"atexit", NULL, NULL, NULL, 0);
-	PyObject *atexit_register= PyObject_GetAttrString(atexit_mod, "register");
+	PyObject *atexit_func= PyObject_GetAttrString(atexit_mod, func_name);
 	PyObject *args= PyTuple_New(1);
 	PyObject *ret;
 
-	PyTuple_SET_ITEM(args, 0, (PyObject *)PyCFunction_New(&meth_bpy_atexit, NULL));
+	PyTuple_SET_ITEM(args, 0, atexit_func_arg);
+	Py_INCREF(atexit_func_arg); /* only incref so we dont dec'ref along with 'args' */
 
-	ret= PyObject_CallObject(atexit_register, args);
+	ret= PyObject_CallObject(atexit_func, args);
 
 	Py_DECREF(atexit_mod);
-	Py_DECREF(atexit_register);
+	Py_DECREF(atexit_func);
 	Py_DECREF(args);
 
 	if(ret) {
@@ -72,5 +74,19 @@
 	else { /* should never happen */
 		PyErr_Print();
 	}
+}
 
+void BPY_atexit_register(void)
+{
+	/* atexit module owns this new function reference */
+	BLI_assert(func_bpy_atregister ==NULL);
+
+	func_bpy_atregister= (PyObject *)PyCFunction_New(&meth_bpy_atexit, NULL);
+	atexit_func_call("register", func_bpy_atregister);
 }
+
+void BPY_atexit_unregister(void)
+{
+	atexit_func_call("unregister", func_bpy_atregister);
+	func_bpy_atregister= NULL; /* don't really need to set but just incase */
+}




More information about the Bf-blender-cvs mailing list