Revision: 16558
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16558
Author:   blendix
Date:     2008-09-16 21:25:35 +0200 (Tue, 16 Sep 2008)

Log Message:
-----------
Fix (harmless) error print about GameLogic.globalDict being lost. Also
fixed some memory leaks in this code and simplified it.

Modified Paths:
--------------
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp        
2008-09-16 19:10:58 UTC (rev 16557)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp        
2008-09-16 19:25:35 UTC (rev 16558)
@@ -115,6 +115,7 @@
          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 @@
          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(void)
 {
+    if(m_pyGlobalDictString) {
+               delete m_pyGlobalDictString;
+               m_pyGlobalDictString = 0;
+               m_pyGlobalDictString_Length = 0;
+       }
+
        exitEngine();
        fSystem->disposeWindow(m_mainWindow);
 }
@@ -680,7 +686,8 @@
                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 @@
 
 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();

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h  
2008-09-16 19:10:58 UTC (rev 16557)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.h  
2008-09-16 19:25:35 UTC (rev 16558)
@@ -74,29 +74,6 @@
                        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);

Modified: trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp      
2008-09-16 19:10:58 UTC (rev 16557)
+++ trunk/blender/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp      
2008-09-16 19:25:35 UTC (rev 16558)
@@ -301,8 +301,6 @@
        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 @@
                                                
                                                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 @@
                                                        }
                                                }
                                                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 @@
 
        free_nodesystem();
 
-       if (pyGlobalDictString) {
-               free(pyGlobalDictString);
-               pyGlobalDictString = NULL;
-       }
-       
        return error ? -1 : 0;
 }
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp    2008-09-16 
19:10:58 UTC (rev 16557)
+++ trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp    2008-09-16 
19:25:35 UTC (rev 16558)
@@ -1393,17 +1393,21 @@
                        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 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;
 }
 


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to