[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35792] trunk/blender: fix for blenderplayer crashing on exit.

Campbell Barton ideasman42 at gmail.com
Sat Mar 26 09:13:43 CET 2011


Revision: 35792
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35792
Author:   campbellbarton
Date:     2011-03-26 08:13:42 +0000 (Sat, 26 Mar 2011)
Log Message:
-----------
fix for blenderplayer crashing on exit.

the event consumer was being freed twice, once when going out of C++ scope, another when freeing the system.

Modified Paths:
--------------
    trunk/blender/intern/ghost/GHOST_C-api.h
    trunk/blender/intern/ghost/GHOST_ISystem.h
    trunk/blender/intern/ghost/intern/GHOST_C-api.cpp
    trunk/blender/intern/ghost/intern/GHOST_System.cpp
    trunk/blender/intern/ghost/intern/GHOST_System.h
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp

Modified: trunk/blender/intern/ghost/GHOST_C-api.h
===================================================================
--- trunk/blender/intern/ghost/GHOST_C-api.h	2011-03-26 05:52:18 UTC (rev 35791)
+++ trunk/blender/intern/ghost/GHOST_C-api.h	2011-03-26 08:13:42 UTC (rev 35792)
@@ -262,7 +262,16 @@
  */
 extern GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle,
 											  GHOST_EventConsumerHandle consumerhandle);
-	
+
+/**
+ * Remove the given event consumer to our list.
+ * @param systemhandle The handle to the system
+ * @param consumerhandle The event consumer to remove.
+ * @return Indication of success.
+ */
+extern GHOST_TSuccess GHOST_RemoveEventConsumer(GHOST_SystemHandle systemhandle,
+											  GHOST_EventConsumerHandle consumerhandle);
+
 /***************************************************************************************
  ** Progress bar functionality
  ***************************************************************************************/

Modified: trunk/blender/intern/ghost/GHOST_ISystem.h
===================================================================
--- trunk/blender/intern/ghost/GHOST_ISystem.h	2011-03-26 05:52:18 UTC (rev 35791)
+++ trunk/blender/intern/ghost/GHOST_ISystem.h	2011-03-26 08:13:42 UTC (rev 35792)
@@ -290,7 +290,14 @@
 	 * @return Indication of success.
 	 */
 	virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer* consumer) = 0;
-	
+
+	/**
+	 * Removes the given event consumer to our list.
+	 * @param consumer The event consumer to remove.
+	 * @return Indication of success.
+	 */
+	virtual GHOST_TSuccess removeEventConsumer(GHOST_IEventConsumer* consumer) = 0;
+
 	 /***************************************************************************************
 	 ** N-degree of freedom device management functionality
 	 ***************************************************************************************/

Modified: trunk/blender/intern/ghost/intern/GHOST_C-api.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_C-api.cpp	2011-03-26 05:52:18 UTC (rev 35791)
+++ trunk/blender/intern/ghost/intern/GHOST_C-api.cpp	2011-03-26 08:13:42 UTC (rev 35792)
@@ -253,6 +253,13 @@
 	return system->addEventConsumer((GHOST_CallbackEventConsumer*)consumerhandle);
 }
 
+GHOST_TSuccess GHOST_RemoveEventConsumer(GHOST_SystemHandle systemhandle, GHOST_EventConsumerHandle consumerhandle)
+{
+	GHOST_ISystem* system = (GHOST_ISystem*) systemhandle;
+
+	return system->removeEventConsumer((GHOST_CallbackEventConsumer*)consumerhandle);
+}
+
 GHOST_TSuccess GHOST_SetProgressBar(GHOST_WindowHandle windowhandle,float progress)
 {
 	GHOST_IWindow* window = (GHOST_IWindow*) windowhandle;

Modified: trunk/blender/intern/ghost/intern/GHOST_System.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_System.cpp	2011-03-26 05:52:18 UTC (rev 35791)
+++ trunk/blender/intern/ghost/intern/GHOST_System.cpp	2011-03-26 08:13:42 UTC (rev 35792)
@@ -226,6 +226,17 @@
 	return success;
 }
 
+GHOST_TSuccess GHOST_System::removeEventConsumer(GHOST_IEventConsumer* consumer)
+{
+	GHOST_TSuccess success;
+	if (m_eventManager) {
+		success = m_eventManager->removeConsumer(consumer);
+	}
+	else {
+		success = GHOST_kFailure;
+	}
+	return success;
+}
 
 GHOST_TSuccess GHOST_System::pushEvent(GHOST_IEvent* event)
 {

Modified: trunk/blender/intern/ghost/intern/GHOST_System.h
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_System.h	2011-03-26 05:52:18 UTC (rev 35791)
+++ trunk/blender/intern/ghost/intern/GHOST_System.h	2011-03-26 08:13:42 UTC (rev 35792)
@@ -183,8 +183,13 @@
 	 */
 	virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer* consumer);
 
+	/**
+	 * Remove the given event consumer to our list.
+	 * @param consumer The event consumer to remove.
+	 * @return Indication of success.
+	 */
+	virtual GHOST_TSuccess removeEventConsumer(GHOST_IEventConsumer* consumer);
 
-
 	/***************************************************************************************
 	 ** N-degree of freedom devcice management functionality
 	 ***************************************************************************************/

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp	2011-03-26 05:52:18 UTC (rev 35791)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp	2011-03-26 08:13:42 UTC (rev 35792)
@@ -939,6 +939,10 @@
 						}
 						app.StopGameEngine();
 
+						/* 'app' is freed automatic when out of scope. 
+						 * removal is needed else the system will free an already freed value */
+						system->removeEventConsumer(&app);
+
 						BLO_blendfiledata_free(bfd);
 					}
 				} while (exitcode == KX_EXIT_REQUEST_RESTART_GAME || exitcode == KX_EXIT_REQUEST_START_OTHER_GAME);




More information about the Bf-blender-cvs mailing list