Revision: 7215
          http://playerstage.svn.sourceforge.net/playerstage/?rev=7215&view=rev
Author:   thjc
Date:     2008-12-28 01:37:39 +0000 (Sun, 28 Dec 2008)

Log Message:
-----------
Merge from 2-1 of 7088:
fix for memory leak in python bindings for blackboard

Modified Paths:
--------------
    code/player/trunk/client_libs/libplayerc/bindings/python/playerc.i

Property Changed:
----------------
    code/player/trunk/


Property changes on: code/player/trunk
___________________________________________________________________
Modified: svn:mergeinfo
   - 
/code/player/branches/release-2-1-patches:6672-6673,6738,6834,6886,6905,6930,6936,6946,6951,6955,6975,6979-6981,6985,6987-6996,7087,7204
/code/player/trunk:6985
   + 
/code/player/branches/release-2-1-patches:6672-6673,6738,6834,6886,6905,6930,6936,6946,6951,6955,6975,6979-6981,6985,6987-6996,7087-7088,7204
/code/player/trunk:6985

Modified: code/player/trunk/client_libs/libplayerc/bindings/python/playerc.i
===================================================================
--- code/player/trunk/client_libs/libplayerc/bindings/python/playerc.i  
2008-12-28 01:32:24 UTC (rev 7214)
+++ code/player/trunk/client_libs/libplayerc/bindings/python/playerc.i  
2008-12-28 01:37:39 UTC (rev 7215)
@@ -445,7 +445,7 @@
 // Returns a new reference to a dictionary object.
 PyObject *__convert_blackboard_entry__(player_blackboard_entry_t *entry)
 {
-  PyObject *entry_dict, *data;
+  PyObject *entry_dict, *data, *temp_pystring;
   char* str;
   int i;
   double d;
@@ -460,54 +460,79 @@
   assert(entry->group);
   assert(entry->group_count > 0);
 
-  ok = PyDict_SetItemString(entry_dict, "key", 
PyString_FromString(entry->key)); // Steals reference
+
+temp_pystring = PyString_FromString(entry->key);
+  ok = PyDict_SetItemString(entry_dict, "key", temp_pystring); // Steals 
reference
   if (ok != 0)
   {
        PyErr_SetString(PyExc_RuntimeError, "Could not set dictionary value for 
'key'");
        Py_XDECREF(entry_dict);
+       Py_XDECREF(temp_pystring);
        return NULL;
   }
+Py_XDECREF(temp_pystring);
 
-  ok = PyDict_SetItemString(entry_dict, "group", 
PyString_FromString(entry->group)); // Steals reference
+
+temp_pystring = PyString_FromString(entry->group);
+  ok = PyDict_SetItemString(entry_dict, "group", temp_pystring); // Steals 
reference
   if (ok != 0)
   {
        PyErr_SetString(PyExc_RuntimeError, "Could not set dictionary value for 
'group'");
        Py_XDECREF(entry_dict);
+       Py_XDECREF(temp_pystring);
        return NULL;
   }
-       
-  ok = PyDict_SetItemString(entry_dict, "type", PyLong_FromLong(entry->type)); 
// Steals reference
+Py_XDECREF(temp_pystring);
+
+
+temp_pystring = PyLong_FromLong(entry->type);
+  ok = PyDict_SetItemString(entry_dict, "type", temp_pystring); // Steals 
reference
   if (ok != 0)
   {
        PyErr_SetString(PyExc_RuntimeError, "Could not set dictionary value for 
'type'");
        Py_XDECREF(entry_dict);
+       Py_XDECREF(temp_pystring);
        return NULL;
   }
+Py_XDECREF(temp_pystring);
 
-  ok = PyDict_SetItemString(entry_dict, "subtype", 
PyLong_FromLong(entry->subtype)); // Steals reference
+
+temp_pystring = PyLong_FromLong(entry->subtype);
+  ok = PyDict_SetItemString(entry_dict, "subtype", temp_pystring); // Steals 
reference
   if (ok != 0)
   {
        PyErr_SetString(PyExc_RuntimeError, "Could not set dictionary value for 
'subtype'");
        Py_XDECREF(entry_dict);
+       Py_XDECREF(temp_pystring);
        return NULL;
   }
+Py_XDECREF(temp_pystring);
 
-  ok = PyDict_SetItemString(entry_dict, "timestamp_sec", 
PyLong_FromLong(entry->timestamp_sec)); // Steals reference
+
+temp_pystring = PyLong_FromLong(entry->timestamp_sec);
+  ok = PyDict_SetItemString(entry_dict, "timestamp_sec", temp_pystring); // 
Steals reference
   if (ok != 0)
   {
        PyErr_SetString(PyExc_RuntimeError, "Could not set dictionary value for 
'timestamp_sec'");
        Py_XDECREF(entry_dict);
+       Py_XDECREF(temp_pystring);
        return NULL;
   }
+Py_XDECREF(temp_pystring);
 
-  ok = PyDict_SetItemString(entry_dict, "timestamp_usec", 
PyLong_FromLong(entry->timestamp_usec)); // Steals reference
+
+temp_pystring = PyLong_FromLong(entry->timestamp_usec);
+  ok = PyDict_SetItemString(entry_dict, "timestamp_usec", temp_pystring); // 
Steals reference
   if (ok != 0)
   {
        PyErr_SetString(PyExc_RuntimeError, "Could not set dictionary value for 
'timestamp_usec'");
        Py_XDECREF(entry_dict);
+       Py_XDECREF(temp_pystring);
        return NULL;
   }
+Py_XDECREF(temp_pystring);
 
+
   switch(entry->subtype)
   {
     case PLAYERC_BLACKBOARD_DATA_SUBTYPE_NONE:
@@ -524,6 +549,7 @@
       }
       memcpy(str, entry->data, entry->data_count);
       data = PyString_FromString(str);
+      free(str);
     break;
     case PLAYERC_BLACKBOARD_DATA_SUBTYPE_INT:
       assert(entry->type == PLAYERC_BLACKBOARD_DATA_TYPE_SIMPLE);
@@ -542,14 +568,16 @@
       Py_INCREF(data);
     break;
   }
-
+  
   ok = PyDict_SetItemString(entry_dict, "data", data); // Steals reference
   if (ok != 0)
   {
        PyErr_SetString(PyExc_RuntimeError, "Could not set dictionary value for 
'data'");
        Py_XDECREF(entry_dict);
+       Py_XDECREF(data);
        return NULL;
   }
+  Py_XDECREF(data);
   
   return entry_dict;
 }
@@ -926,19 +954,17 @@
     PyErr_SetString(PyExc_RuntimeError, "Failed to get entry");
     return NULL;
   }
+  
   entry_dict = playerc_blackboard___convert_blackboard_entry__(self, entry); 
// New reference
   
   groups_dict = PyTuple_GetItem((PyObject*)self->py_private, 
DICT_GROUPS_INDEX); // Borrowed reference
   assert(groups_dict);
   assert(entry_dict);
-  Py_INCREF(entry_dict);
+  //Py_INCREF(entry_dict);
   playerc_blackboard___set_nested_dictionary_entry__(self, groups_dict, key, 
group, entry_dict); // Steals reference to entry_dict
+  
+  player_blackboard_entry_t_free(entry);
 
-  free(entry->key);
-  free(entry->group);
-  free(entry->data);
-  free(entry);
-
   return entry_dict;
 }
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
_______________________________________________
Playerstage-commit mailing list
Playerstage-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to