[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