Fix (harmless) error print about GameLogic.globalDict being lost. Also
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 16 Sep 2008 19:25:35 +0000 (19:25 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 16 Sep 2008 19:25:35 +0000 (19:25 +0000)
fixed some memory leaks in this code and simplified it.

source/gameengine/GamePlayer/ghost/GPG_Application.cpp
source/gameengine/GamePlayer/ghost/GPG_Application.h
source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
source/gameengine/Ketsji/KX_PythonInit.cpp

index 580c80ee0a57ee74548cf07a9b999fb42cffd06a..752b776beff7ed075399cc8ab35c480483abbc1b 100644 (file)
@@ -115,6 +115,7 @@ GPG_Application::GPG_Application(GHOST_ISystem* system)
          m_cursor(GHOST_kStandardCursorFirstCursor),
          m_engineInitialized(0), 
          m_engineRunning(0), 
+         m_isEmbedded(false),
          m_ketsjiengine(0),
          m_kxsystem(0), 
          m_keyboard(0), 
@@ -128,8 +129,7 @@ GPG_Application::GPG_Application(GHOST_ISystem* system)
          m_blendermat(0),
          m_blenderglslmat(0),
          m_pyGlobalDictString(0),
-         m_pyGlobalDictString_Length(0),
-         m_isEmbedded(false)
+         m_pyGlobalDictString_Length(0)
 {
        fSystem = system;
 }
@@ -138,6 +138,12 @@ GPG_Application::GPG_Application(GHOST_ISystem* system)
 
 GPG_Application::~GPG_Application(void)
 {
+    if(m_pyGlobalDictString) {
+               delete m_pyGlobalDictString;
+               m_pyGlobalDictString = 0;
+               m_pyGlobalDictString_Length = 0;
+       }
+
        exitEngine();
        fSystem->disposeWindow(m_mainWindow);
 }
@@ -680,7 +686,8 @@ bool GPG_Application::startEngine(void)
                initPythonConstraintBinding();
                initMathutils();
 
-               /* Restore the dict */
+               // Set the GameLogic.globalDict from marshal'd data, so we can
+               // load new blend files and keep data in GameLogic.globalDict
                loadGamePythonConfig(m_pyGlobalDictString, m_pyGlobalDictString_Length);
                
                m_sceneconverter->ConvertScene(
@@ -718,13 +725,15 @@ bool GPG_Application::startEngine(void)
 
 void GPG_Application::stopEngine()
 {
-       // get the python dict and convert to a string for future use
-       char *marshal_buffer;
-       m_pyGlobalDictString_Length = saveGamePythonConfig(&marshal_buffer);
-       if (m_pyGlobalDictString_Length) {
-               m_pyGlobalDictString = static_cast<char *> (malloc(m_pyGlobalDictString_Length));
-               memcpy(m_pyGlobalDictString, marshal_buffer, m_pyGlobalDictString_Length);
-       } 
+       // GameLogic.globalDict gets converted into a buffer, and sorted in
+       // m_pyGlobalDictString so we can restore after python has stopped
+       // and started between .blend file loads.
+       if(m_pyGlobalDictString) {
+               delete m_pyGlobalDictString;
+               m_pyGlobalDictString = 0;
+       }
+
+       m_pyGlobalDictString_Length = saveGamePythonConfig(&m_pyGlobalDictString);
        
        // when exiting the mainloop
        exitGamePythonScripting();
index 7fc369fc0fd0ca93aa035ea76ead8a1745dddba5..38408f919b4217901466b8bed2d3cef6f12f6094 100644 (file)
@@ -74,29 +74,6 @@ public:
                        bool StartGameEngine(int stereoMode);
                        void StopGameEngine();
 
-                       char*
-               GetPyGlobalDictMarshal()
-               { 
-                       return m_pyGlobalDictString;
-               };
-               
-                       void
-               SetPyGlobalDictMarshal( char* pyGlobalDictString, int length )
-               {
-                       if (m_pyGlobalDictString && m_pyGlobalDictString != pyGlobalDictString)
-                               free(m_pyGlobalDictString);
-                       
-                       m_pyGlobalDictString = pyGlobalDictString;
-                       m_pyGlobalDictString_Length = length;
-               };
-               
-                       int
-               GetPyGlobalDictMarshalLength()
-               { 
-                       return m_pyGlobalDictString_Length;
-               };
-
-
 protected:
        bool    handleWheel(GHOST_IEvent* event);
        bool    handleButton(GHOST_IEvent* event, bool isDown);
index 8fd23318df15ada90418938364cea9ca7f87cc0b..01774a68cc4942a0cf3a0c1eab99f5d2735748b6 100644 (file)
@@ -301,8 +301,6 @@ int main(int argc, char** argv)
        GHOST_TUns32 fullScreenHeight= 0;
        int fullScreenBpp = 32;
        int fullScreenFrequency = 60;
-       char* pyGlobalDictString = NULL; /* store python dict data between blend file loading */
-       int pyGlobalDictString_Length = 0;
        GHOST_TEmbedderWindowID parentWindow = 0;
 
 
@@ -658,10 +656,6 @@ int main(int argc, char** argv)
                                                
                                                titlename = maggie->name;
                                                
-                                               // Set the GameLogic.globalDict from marshal'd data, so we can load new blend files
-                                               // abd keep data in GameLogic.globalDict
-                                               app.SetPyGlobalDictMarshal(pyGlobalDictString, pyGlobalDictString_Length);
-                                               
                                                // Check whether the game should be displayed full-screen
                                                if ((!fullScreenParFound) && (!windowParFound))
                                                {
@@ -790,12 +784,7 @@ int main(int argc, char** argv)
                                                        }
                                                }
                                                app.StopGameEngine();
-                                               
-                                               // GameLogic.globalDict has been converted into a buffer
-                                               // store in pyGlobalDictString so we can restore after python has stopped and started.
-                                               pyGlobalDictString = app.GetPyGlobalDictMarshal();
-                                               pyGlobalDictString_Length = app.GetPyGlobalDictMarshalLength();
-                                               
+
                                                BLO_blendfiledata_free(bfd);
                                        }
                                } while (exitcode == KX_EXIT_REQUEST_RESTART_GAME || exitcode == KX_EXIT_REQUEST_START_OTHER_GAME);
@@ -814,11 +803,6 @@ int main(int argc, char** argv)
 
        free_nodesystem();
 
-       if (pyGlobalDictString) {
-               free(pyGlobalDictString);
-               pyGlobalDictString = NULL;
-       }
-       
        return error ? -1 : 0;
 }
 
index 5308a0b95363b17b3e827d13314950432d064449..09c49a15f763241e2eeb63d3643ae81d9b9cfa47 100644 (file)
@@ -1393,17 +1393,21 @@ int saveGamePythonConfig( char **marshal_buffer)
                        PyObject* pyGlobalDictMarshal = PyMarshal_WriteObjectToString(  pyGlobalDict ); 
 #endif
                        if (pyGlobalDictMarshal) {
-                               marshal_length= PyString_Size(pyGlobalDictMarshal);
                                // for testing only
                                // PyObject_Print(pyGlobalDictMarshal, stderr, 0);
-                               *marshal_buffer = PyString_AsString(pyGlobalDictMarshal);
+
+                               marshal_length= PyString_Size(pyGlobalDictMarshal);
+                               *marshal_buffer = new char[marshal_length + 1];
+                               memcpy(*marshal_buffer, PyString_AsString(pyGlobalDictMarshal), marshal_length);
+
+                               Py_DECREF(pyGlobalDictMarshal);
                        } else {
                                printf("Error, GameLogic.globalDict could not be marshal'd\n");
                        }
-                       Py_DECREF(gameLogic);
                } else {
                        printf("Error, GameLogic.globalDict was removed\n");
                }
+               Py_DECREF(gameLogic);
        } else {
                printf("Error, GameLogic failed to import GameLogic.globalDict will be lost\n");
        }
@@ -1412,20 +1416,26 @@ int saveGamePythonConfig( char **marshal_buffer)
 
 int loadGamePythonConfig(char *marshal_buffer, int marshal_length)
 {
-       PyObject* gameLogic = PyImport_ImportModule("GameLogic");
        /* Restore the dict */
        if (marshal_buffer) {
-               PyObject* pyGlobalDict = PyMarshal_ReadObjectFromString(marshal_buffer, marshal_length);
-               if (pyGlobalDict) {
-                       PyDict_SetItemString(PyModule_GetDict(gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
-                       return 1;
+               PyObject* gameLogic = PyImport_ImportModule("GameLogic");
+
+               if (gameLogic) {
+                       PyObject* pyGlobalDict = PyMarshal_ReadObjectFromString(marshal_buffer, marshal_length);
+
+                       if (pyGlobalDict) {
+                               PyDict_SetItemString(PyModule_GetDict(gameLogic), "globalDict", pyGlobalDict); // Same as importing the module.
+                               Py_DECREF(gameLogic);
+                               return 1;
+                       } else {
+                               Py_DECREF(gameLogic);
+                               PyErr_Clear();
+                               printf("Error could not marshall string\n");
+                       }
                } else {
-                       PyErr_Clear();
-                       printf("Error could not marshall string\n");
-               }
-       } else {
-               printf("Error, GameLogic failed to import GameLogic.globalDict will be lost\n");
-       }       
+                       printf("Error, GameLogic failed to import GameLogic.globalDict will be lost\n");
+               }       
+       }
        return 0;
 }