Fix memleaks and slightly improve perfs 90/10290/2
Calixte DENIZET [Thu, 24 Jan 2013 14:58:15 +0000 (15:58 +0100)]
Change-Id: I43b8f2a966a1d7f9012e0365b931bf0fddff31c9

scilab/modules/graphic_objects/src/cpp/ScilabView.cpp
scilab/modules/graphic_objects/src/cpp/dataModel.cpp
scilab/modules/graphic_objects/src/java/org/scilab/modules/graphic_objects/graphicView/ScilabView.java
scilab/modules/graphics/sci_gateway/c/sci_xrects.c
scilab/modules/graphics/src/c/BuildObjects.c
scilab/modules/graphics/src/c/CloneObjects.c
scilab/modules/graphics/src/c/InitObjects.c
scilab/modules/graphics/src/c/Plo2dn.c
scilab/modules/graphics/src/c/sciCall.c

index af96aeb..78be5a2 100644 (file)
@@ -140,7 +140,6 @@ void ScilabView::getFiguresId(int ids[])
 int ScilabView::getNbFigure(void)
 {
     return (int)m_figureList.size();
-
 }
 
 void ScilabView::createObject(char const* pstId)
@@ -167,15 +166,10 @@ void ScilabView::deleteObject(char const* pstId)
     int *piType = &iType;
     char *pstParentUID = NULL;
 
-    getGraphicObjectProperty(pstId, __GO_TYPE__, jni_int, (void **)&piType);
-
     /*
     ** If deleting a figure, remove from figure list.
     */
-    if (iType != -1 && iType == __GO_FIGURE__)
-    {
-        m_figureList.erase(pstId);
-    }
+    m_figureList.erase(pstId);
 
     /*
     ** If deleting current figure find another current one,
@@ -208,9 +202,10 @@ void ScilabView::deleteObject(char const* pstId)
     }
 
     // Remove the corresponding handle.
-    m_uidList.erase(m_handleList.find(pstId)->second);
-    m_handleList.erase(pstId);
-
+    __handleList_iterator it = m_handleList.find(pstId);
+    m_uidList.erase(it->second);
+    m_handleList.erase(it);
+    
     deleteDataObject(pstId);
 }
 
index 69f4601..bbd7f44 100644 (file)
@@ -96,12 +96,19 @@ char const* DataModel::createDataObject(char const* _pstID, int _iType)
 
 void DataModel::deleteDataObject(char const* _pstID)
 {
-    Data3D* newObject = (*m_dataMap)[std::string(_pstID)];
+    std::map<std::string, Data3D*>::iterator it = m_dataMap->find(std::string(_pstID)); 
+    if (it != m_dataMap->end() && it->second != NULL)
+    {
+        delete it->second;
+       m_dataMap->erase(it);
+    }
+  
+    /*Data3D* newObject = (*m_dataMap)[std::string(_pstID)];
     if (newObject != NULL)
     {
         delete newObject;
     }
 
-    m_dataMap->erase(std::string(_pstID));
+    m_dataMap->erase(std::string(_pstID));*/
 }
 
index 946ef95..38fe14c 100644 (file)
@@ -12,6 +12,7 @@
 package org.scilab.modules.graphic_objects.graphicView;
 
 import org.scilab.modules.graphic_objects.ScilabNativeView;
+import org.scilab.modules.graphic_objects.graphicObject.GraphicObjectProperties;
 
 public class ScilabView extends ScilabNativeView implements GraphicView {
 
@@ -36,7 +37,8 @@ public class ScilabView extends ScilabNativeView implements GraphicView {
     }
 
     public void updateObject(String id, int property) {
-        ScilabNativeView__updateObject(id, property);
+        if (property == GraphicObjectProperties.__GO_ID__) {
+            ScilabNativeView__updateObject(id, property);
+        }
     }
-
 }
index 4284f96..4a8412e 100644 (file)
@@ -120,6 +120,8 @@ int sci_xrects( char *fname, unsigned long fname_len )
     /** make Compound current object **/
     setCurrentObject(pstCompoundUID);
 
+    releaseGraphicObjectProperty(-1, pstCompoundUID, jni_string, 0);
+
     LhsVar(1) = 0;
     PutLhsVar();
     return 0;
index e26d489..c0ad2be 100644 (file)
@@ -592,6 +592,7 @@ char * allocatePolyline(char * pparentsubwinUID, double *pvecx, double *pvecy, d
         {
             deleteGraphicObject(pobjUID);
             deleteDataObject(pobjUID);
+           releaseGraphicObjectProperty(__GO_PARENT__, pobjUID, jni_string, 1);
             return NULL;
         }
 
@@ -601,6 +602,7 @@ char * allocatePolyline(char * pparentsubwinUID, double *pvecx, double *pvecy, d
         {
             deleteGraphicObject(pobjUID);
             deleteDataObject(pobjUID);
+           releaseGraphicObjectProperty(__GO_PARENT__, pobjUID, jni_string, 1);
             return NULL;
         }
 
@@ -661,6 +663,7 @@ char * allocatePolyline(char * pparentsubwinUID, double *pvecx, double *pvecy, d
         {
             deleteGraphicObject(pobjUID);
             deleteDataObject(pobjUID);
+           releaseGraphicObjectProperty(__GO_PARENT__, pobjUID, jni_string, 1);
             return NULL;
         }
     }
@@ -1396,6 +1399,7 @@ char *ConstructAxis(char *pparentsubwinUID, char dir, char tics, double *vx,
         if (tics_labels == NULL)
         {
             deleteGraphicObject(pobjUID);
+           releaseGraphicObjectProperty(__GO_PARENT__, pobjUID, jni_string, 1);
             return (char *)NULL;
         }
 
@@ -1660,6 +1664,7 @@ char *ConstructSegs(char *pparentsubwinUID, int type,
     if (arrowCoords == NULL)
     {
         deleteGraphicObject(pobjUID);
+       releaseGraphicObjectProperty(__GO_SEGS__, pobjUID, jni_string, 1);
         return (char *)NULL;
     }
 
index c60effc..09981d1 100644 (file)
@@ -232,6 +232,7 @@ char* clonePolyline(char* sourcePolyline)
     /* These properties must be aditionally set as this is not done by allocatePolyline */
     setGraphicObjectProperty(clonedPolylineUID, __GO_LINE_STYLE__, &lineStyle, jni_int, 1);
     setGraphicObjectProperty(clonedPolylineUID, __GO_LINE_THICKNESS__, &lineThickness, jni_double, 1);
+    releaseGraphicObjectProperty(__GO_POLYLINE__, clonedPolylineUID, jni_string, 1);
 
     /*
      * Some these properties are passed by value thus do not care to release them
index e60e3df..fc96b08 100644 (file)
@@ -211,6 +211,7 @@ int C2F(graphicsmodels) (void)
 
     /* Sets the parent-child relationship between the default Figure and Axes */
     setGraphicObjectRelationship(pfiguremdlUID, paxesmdlUID);
+    releaseGraphicObjectProperty(-1, pfiguremdlUID, jni_string, 0);
 
     /* Axes Model properties */
 
@@ -247,6 +248,8 @@ int C2F(graphicsmodels) (void)
     firstPlot = 1;
     setGraphicObjectProperty(paxesmdlUID, __GO_FIRST_PLOT__, &firstPlot, jni_bool, 1);
 
+    releaseGraphicObjectProperty(-1, paxesmdlUID, jni_string, 0);
+
 #if 0
     ppaxesmdl->FirstPlot = TRUE;
 #endif
@@ -559,15 +562,19 @@ int InitAxesModel()
     /* Creates the Axes model's labels and sets the model as their parent */
     labelUID = initLabel(paxesmdlUID);
     setGraphicObjectProperty(paxesmdlUID, __GO_TITLE__, labelUID, jni_string, 1);
+    releaseGraphicObjectProperty(__GO_TITLE__, labelUID, jni_string, 0);
 
     labelUID = initLabel(paxesmdlUID);
     setGraphicObjectProperty(paxesmdlUID, __GO_X_AXIS_LABEL__, labelUID, jni_string, 1);
+    releaseGraphicObjectProperty(__GO_X_AXIS_LABEL__, labelUID, jni_string, 0);
 
     labelUID = initLabel(paxesmdlUID);
     setGraphicObjectProperty(paxesmdlUID, __GO_Y_AXIS_LABEL__, labelUID, jni_string, 1);
+    releaseGraphicObjectProperty(__GO_Y_AXIS_LABEL__, labelUID, jni_string, 0);
 
     labelUID = initLabel(paxesmdlUID);
     setGraphicObjectProperty(paxesmdlUID, __GO_Z_AXIS_LABEL__, labelUID, jni_string, 1);
+    releaseGraphicObjectProperty(__GO_Z_AXIS_LABEL__, labelUID, jni_string, 0);
 
     return 0;
 }
index 1666fb5..77a322d 100644 (file)
@@ -473,6 +473,7 @@ int plot2dn(int ptype, char *logflags, double *x, double *y, int *n1, int *n2, i
             setGraphicObjectRelationship(psubwinUID, compoundUID);
             getGraphicObjectProperty(psubwinUID, __GO_VISIBLE__, jni_bool, (void **)&piParentVisible);
             setGraphicObjectProperty(compoundUID, __GO_VISIBLE__, &parentVisible, jni_bool, 1);
+           releaseGraphicObjectProperty(__GO_PARENT__, compoundUID, jni_string, 1);
         }
         FREE(hdltab);
 
index e218aba..3d340cb 100644 (file)
@@ -98,6 +98,8 @@ void Objrect ( double * x         ,
 
     setCurrentObject(newObjUID);
     *hdl = getHandle(newObjUID);
+
+    releaseGraphicObjectProperty(-1, newObjUID, jni_string, 0);
 }
 
 
@@ -169,6 +171,8 @@ void Objpoly ( double  * x     ,
 
     setCurrentObject(pobjUID);
     *hdl = getHandle(pobjUID);
+
+    releaseGraphicObjectProperty(__GO_POLYLINE__, pobjUID, jni_string, 1);
 }
 
 
@@ -273,6 +277,7 @@ void Objsegs ( int * style,
     }
 
     setCurrentObject(pobjUID);
+    releaseGraphicObjectProperty(__GO_SEGS__, pobjUID, jni_string, 1);
 }
 /*-----------------------------------------------------------
  * Objstring: