[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40394] trunk/blender/source/blender: fix [#28672] Blender segfault after exiting a game that was opened with

Campbell Barton ideasman42 at gmail.com
Tue Sep 20 14:22:20 CEST 2011


Revision: 40394
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40394
Author:   campbellbarton
Date:     2011-09-20 12:22:19 +0000 (Tue, 20 Sep 2011)
Log Message:
-----------
fix [#28672] Blender segfault after exiting a game that was opened with
autoplay on (Blender, not blenderplayer)

blender now stops the sound system and free's its self on Pythons
sys.exit().

Modified Paths:
--------------
    trunk/blender/source/blender/python/intern/CMakeLists.txt
    trunk/blender/source/blender/python/intern/bpy.h
    trunk/blender/source/blender/python/intern/bpy_interface.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c

Added Paths:
-----------
    trunk/blender/source/blender/python/intern/bpy_interface_atexit.c

Modified: trunk/blender/source/blender/python/intern/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/python/intern/CMakeLists.txt	2011-09-20 12:01:16 UTC (rev 40393)
+++ trunk/blender/source/blender/python/intern/CMakeLists.txt	2011-09-20 12:22:19 UTC (rev 40394)
@@ -47,6 +47,7 @@
 	bpy_app_handlers.c
 	bpy_driver.c
 	bpy_interface.c
+	bpy_interface_atexit.c
 	bpy_intern_string.c
 	bpy_library.c
 	bpy_operator.c

Modified: trunk/blender/source/blender/python/intern/bpy.h
===================================================================
--- trunk/blender/source/blender/python/intern/bpy.h	2011-09-20 12:01:16 UTC (rev 40393)
+++ trunk/blender/source/blender/python/intern/bpy.h	2011-09-20 12:22:19 UTC (rev 40394)
@@ -28,3 +28,6 @@
  
 void BPy_init_modules(void);
 extern PyObject *bpy_package_py;
+
+/* bpy_interface_atexit.c */
+void BPY_atexit_init(void);

Modified: trunk/blender/source/blender/python/intern/bpy_interface.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_interface.c	2011-09-20 12:01:16 UTC (rev 40393)
+++ trunk/blender/source/blender/python/intern/bpy_interface.c	2011-09-20 12:22:19 UTC (rev 40394)
@@ -30,7 +30,7 @@
  
 /* grr, python redefines */
 #ifdef _POSIX_C_SOURCE
-#undef _POSIX_C_SOURCE
+#  undef _POSIX_C_SOURCE
 #endif
 
 #include <Python.h>
@@ -241,6 +241,8 @@
 	
 	pyrna_alloc_types();
 
+	BPY_atexit_init(); /* this can init any time */
+
 #ifndef WITH_PYTHON_MODULE
 	py_tstate= PyGILState_GetThisThreadState();
 	PyEval_ReleaseThread(py_tstate);

Added: trunk/blender/source/blender/python/intern/bpy_interface_atexit.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_interface_atexit.c	                        (rev 0)
+++ trunk/blender/source/blender/python/intern/bpy_interface_atexit.c	2011-09-20 12:22:19 UTC (rev 40394)
@@ -0,0 +1,76 @@
+/*
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/bpy_interface_atexit.c
+ *  \ingroup pythonintern
+ */
+
+
+#include <Python.h>
+
+#include "bpy_util.h"
+
+#include "WM_api.h"
+
+#include "BLI_utildefines.h"
+
+static PyObject *bpy_atexit(PyObject *UNUSED(self), PyObject *UNUSED(args), PyObject *UNUSED(kw))
+{
+	/* close down enough of blender at least not to crash */
+	struct bContext *C= BPy_GetContext();
+
+	WM_exit_ext(C, 0);
+
+	Py_RETURN_NONE;
+}
+
+static PyMethodDef meth_bpy_atexit= {"bpy_atexit", (PyCFunction)bpy_atexit, METH_NOARGS, NULL};
+
+void BPY_atexit_init(void)
+{
+	/* 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 *args= PyTuple_New(1);
+	PyObject *ret;
+
+	PyTuple_SET_ITEM(args, 0, (PyObject *)PyCFunction_New(&meth_bpy_atexit, NULL));
+
+	ret= PyObject_CallObject(atexit_register, args);
+
+	Py_DECREF(atexit_mod);
+	Py_DECREF(atexit_register);
+	Py_DECREF(args);
+
+	if(ret) {
+		Py_DECREF(ret);
+	}
+	else { /* should never happen */
+		PyErr_Print();
+	}
+
+}

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2011-09-20 12:01:16 UTC (rev 40393)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2011-09-20 12:22:19 UTC (rev 40394)
@@ -72,6 +72,7 @@
 void		WM_setinitialstate_normal(void);
 
 void		WM_init				(struct bContext *C, int argc, const char **argv);
+void		WM_exit_ext			(struct bContext *C, const short do_python);
 void		WM_exit				(struct bContext *C);
 void		WM_main				(struct bContext *C);
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c	2011-09-20 12:01:16 UTC (rev 40393)
+++ trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c	2011-09-20 12:22:19 UTC (rev 40394)
@@ -342,7 +342,8 @@
 extern void free_posebuf(void); 
 
 /* called in creator.c even... tsk, split this! */
-void WM_exit(bContext *C)
+/* note, doesnt run exit() call WM_exit() for that */
+void WM_exit_ext(bContext *C, const short do_python)
 {
 	wmWindow *win;
 
@@ -408,14 +409,17 @@
 	
 
 #ifdef WITH_PYTHON
-	/* XXX - old note */
-	/* before free_blender so py's gc happens while library still exists */
-	/* needed at least for a rare sigsegv that can happen in pydrivers */
+	/* option not to close python so we can use 'atexit' */
+	if(do_python) {
+		/* XXX - old note */
+		/* before free_blender so py's gc happens while library still exists */
+		/* needed at least for a rare sigsegv that can happen in pydrivers */
 
-	/* Update for blender 2.5, move after free_blender because blender now holds references to PyObject's
-	 * so decref'ing them after python ends causes bad problems every time
-	 * the pyDriver bug can be fixed if it happens again we can deal with it then */
-	BPY_python_end();
+		/* Update for blender 2.5, move after free_blender because blender now holds references to PyObject's
+		 * so decref'ing them after python ends causes bad problems every time
+		 * the pyDriver bug can be fixed if it happens again we can deal with it then */
+		BPY_python_end();
+	}
 #endif
 
 	GPU_global_buffer_pool_free();
@@ -460,6 +464,10 @@
 		getchar();
 	}
 #endif 
+}
+
+void WM_exit(bContext *C)
+{
+	WM_exit_ext(C, 1);
 	exit(G.afbreek==1);
 }
-




More information about the Bf-blender-cvs mailing list