[mapguide-commits] r4438 - trunk/MgDev/Server/src/Services/Rendering

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Mon Dec 14 18:38:53 EST 2009


Author: waltweltonlair
Date: 2009-12-14 18:38:52 -0500 (Mon, 14 Dec 2009)
New Revision: 4438

Modified:
   trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp
Log:
Fix #1206 (Small memory leaks in MgServerRenderingService)

Make sure renderers are always deleted by wrapping them in auto_ptr's.


Modified: trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp
===================================================================
--- trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp	2009-12-14 22:32:39 UTC (rev 4437)
+++ trunk/MgDev/Server/src/Services/Rendering/ServerRenderingService.cpp	2009-12-14 23:38:52 UTC (rev 4438)
@@ -227,7 +227,7 @@
 
     // initialize the renderer (set clipping to false so that we label
     // the unclipped geometry)
-    SE_Renderer* dr = CreateRenderer(width, height, bgColor, false, true, tileExtentOffset);
+    auto_ptr<SE_Renderer> dr(CreateRenderer(width, height, bgColor, false, true, tileExtentOffset));
 
     // create a temporary collection containing all the layers for the base group
     Ptr<MgLayerCollection> layers = map->GetLayers();
@@ -245,10 +245,8 @@
     baseGroup->SetVisible(true);
 
     // call the internal helper API to do all the stylization overhead work
-    ret = RenderMapInternal(map, NULL, roLayers, dr, width, height, format, scale, extent, true, true);
+    ret = RenderMapInternal(map, NULL, roLayers, dr.get(), width, height, format, scale, extent, true, true);
 
-    delete dr;
-
     // restore the base group's visibility
     baseGroup->SetVisible(groupVisible);
 
@@ -321,7 +319,7 @@
     bgColor.alpha() = 0;
 
     // initialize the renderer
-    SE_Renderer* dr = CreateRenderer(width, height, bgColor, true);
+    auto_ptr<SE_Renderer> dr(CreateRenderer(width, height, bgColor, true));
 
     // create a temporary collection containing all the dynamic layers
     Ptr<MgLayerCollection> layers = map->GetLayers();
@@ -335,10 +333,8 @@
     }
 
     // call the internal helper API to do all the stylization overhead work
-    ret = RenderMapInternal(map, selection, roLayers, dr, width, height, scale, extent, false, options);
+    ret = RenderMapInternal(map, selection, roLayers, dr.get(), width, height, scale, extent, false, options);
 
-    delete dr;
-
     MG_CATCH_AND_THROW(L"MgServerRenderingService.RenderDynamicOverlay")
 
     return ret.Detach();
@@ -490,13 +486,11 @@
     // initialize the renderer with the rendering canvas size - in this
     // case it is not necessarily the same size as the requested image
     // size due to support for non-square pixels
-    SE_Renderer* dr = CreateRenderer(drawWidth, drawHeight, bgcolor, false);
+    auto_ptr<SE_Renderer> dr(CreateRenderer(drawWidth, drawHeight, bgcolor, false));
 
     // call the internal helper API to do all the stylization overhead work
-    ret = RenderMapInternal(map, selection, NULL, dr, width, height, format, scale, b, false, bKeepSelection);
+    ret = RenderMapInternal(map, selection, NULL, dr.get(), width, height, format, scale, b, false, bKeepSelection);
 
-    delete dr;
-
     MG_CATCH_AND_THROW(L"MgServerRenderingService.RenderMap")
 
     return ret.Detach();
@@ -576,13 +570,11 @@
                      backgroundColor->GetAlpha());
 
     // initialize the appropriate map renderer
-    SE_Renderer* dr = CreateRenderer(width, height, bgcolor, bClip);
+    auto_ptr<SE_Renderer> dr(CreateRenderer(width, height, bgcolor, bClip));
 
     // call the internal helper API to do all the stylization overhead work
-    ret = RenderMapInternal(map, selection, NULL, dr, width, height, format, scale, b, false, bKeepSelection);
+    ret = RenderMapInternal(map, selection, NULL, dr.get(), width, height, format, scale, b, false, bKeepSelection);
 
-    delete dr;
-
     MG_CATCH_AND_THROW(L"MgServerRenderingService.RenderMap")
 
     return ret.Detach();
@@ -623,7 +615,7 @@
 
     double point_buf[2];
     double* point = NULL;
-    SE_Renderer* impRenderer = NULL;
+    auto_ptr<SE_Renderer> impRenderer;
     if (geometry && maxFeatures == 1)
     {
         MgPolygon* polygon = dynamic_cast<MgPolygon*>(geometry);
@@ -657,18 +649,15 @@
                 point = point_buf;
 
                 RS_Color bgColor; // not used
-                impRenderer = CreateRenderer(1, 1, bgColor, false);
+                impRenderer.reset(CreateRenderer(1, 1, bgColor, false));
             }
         }
     }
 
-    FeatureInfoRenderer fir(sel, maxFeatures, map->GetViewScale(), point, impRenderer);
+    FeatureInfoRenderer fir(sel, maxFeatures, map->GetViewScale(), point, impRenderer.get());
 
     RenderForSelection(map, layerNames, geometry, selectionVariant, featureFilter, maxFeatures, layerAttributeFilter, &fir);
 
-    if (impRenderer)
-        delete impRenderer;
-
     //fill out the output object with the info we collected
     //in the FeatureInfoRenderer for the first feature we hit
     if (fir.GetNumFeaturesProcessed() > 0)
@@ -962,7 +951,7 @@
                      backgroundColor->GetAlpha());
 
     //initialize a renderer
-    Renderer* dr = CreateRenderer(width, height, bgcolor, false, false, 0.0);
+    auto_ptr<Renderer> dr(CreateRenderer(width, height, bgcolor, false, false, 0.0));
 
     RS_Bounds b(0,0,width,height);
 
@@ -993,9 +982,9 @@
     auto_ptr<RS_ByteData> data;
 
     if (wcscmp(m_rendererName.c_str(), L"AGG") == 0)
-        data.reset(((AGGRenderer*)dr)->Save(format, width, height));
+        data.reset(((AGGRenderer*)dr.get())->Save(format, width, height));
     else
-        data.reset(((GDRenderer*)dr)->Save(format, width, height));
+        data.reset(((GDRenderer*)dr.get())->Save(format, width, height));
 
     if (NULL != data.get())
     {
@@ -1014,8 +1003,6 @@
         ret = bs->GetReader();
     }
 
-    delete dr;
-
     MG_CATCH_AND_THROW(L"MgServerRenderingService.RenderMapLegend")
 
     return ret.Detach();



More information about the mapguide-commits mailing list