From 52a80f17423afc0049117c812cacab159f544639 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 22 Aug 2016 05:47:19 +0100 Subject: [PATCH] workaround potencial memory leak --- .../Handlers/GetTexture/GetTextureHandler.cs | 37 +++++++++--------- .../GetTexture/GetTextureRobustHandler.cs | 38 ++++++++++--------- .../Hypergrid/GatekeeperServiceConnector.cs | 6 +-- ThirdParty/SmartThreadPool/SmartThreadPool.cs | 3 ++ 4 files changed, 47 insertions(+), 37 deletions(-) diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs index ac99692297..8215124625 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureHandler.cs @@ -354,9 +354,9 @@ namespace OpenSim.Capabilities.Handlers byte[] data = new byte[0]; MemoryStream imgstream = new MemoryStream(); - Bitmap mTexture = new Bitmap(1, 1); - ManagedImage managedImage; - Image image = (Image)mTexture; + Bitmap mTexture = null; + ManagedImage managedImage = null; + Image image = null; try { @@ -365,25 +365,26 @@ namespace OpenSim.Capabilities.Handlers imgstream = new MemoryStream(); // Decode image to System.Drawing.Image - if (OpenJPEG.DecodeToImage(texture.Data, out managedImage, out image)) + if (OpenJPEG.DecodeToImage(texture.Data, out managedImage, out image) && image != null) { // Save to bitmap mTexture = new Bitmap(image); - EncoderParameters myEncoderParameters = new EncoderParameters(); - myEncoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 95L); - - // Save bitmap to stream - ImageCodecInfo codec = GetEncoderInfo("image/" + format); - if (codec != null) + using(EncoderParameters myEncoderParameters = new EncoderParameters()) { - mTexture.Save(imgstream, codec, myEncoderParameters); - // Write the stream to a byte array for output - data = imgstream.ToArray(); - } - else - m_log.WarnFormat("[GETTEXTURE]: No such codec {0}", format); + myEncoderParameters.Param[0] = new EncoderParameter(Encoder.Quality,95L); + // Save bitmap to stream + ImageCodecInfo codec = GetEncoderInfo("image/" + format); + if (codec != null) + { + mTexture.Save(imgstream, codec, myEncoderParameters); + // Write the stream to a byte array for output + data = imgstream.ToArray(); + } + else + m_log.WarnFormat("[GETTEXTURE]: No such codec {0}", format); + } } } catch (Exception e) @@ -399,7 +400,9 @@ namespace OpenSim.Capabilities.Handlers if (image != null) image.Dispose(); - + + if(managedImage != null) + managedImage.Clear(); if (imgstream != null) { imgstream.Close(); diff --git a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureRobustHandler.cs b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureRobustHandler.cs index f8134716ab..518f74ebc8 100644 --- a/OpenSim/Capabilities/Handlers/GetTexture/GetTextureRobustHandler.cs +++ b/OpenSim/Capabilities/Handlers/GetTexture/GetTextureRobustHandler.cs @@ -359,9 +359,9 @@ namespace OpenSim.Capabilities.Handlers byte[] data = new byte[0]; MemoryStream imgstream = new MemoryStream(); - Bitmap mTexture = new Bitmap(1, 1); - ManagedImage managedImage; - Image image = (Image)mTexture; + Bitmap mTexture = null; + ManagedImage managedImage = null; + Image image = null; try { @@ -370,25 +370,26 @@ namespace OpenSim.Capabilities.Handlers imgstream = new MemoryStream(); // Decode image to System.Drawing.Image - if (OpenJPEG.DecodeToImage(texture.Data, out managedImage, out image)) + if (OpenJPEG.DecodeToImage(texture.Data, out managedImage, out image) && image != null) { // Save to bitmap mTexture = new Bitmap(image); - - EncoderParameters myEncoderParameters = new EncoderParameters(); - myEncoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 95L); - - // Save bitmap to stream - ImageCodecInfo codec = GetEncoderInfo("image/" + format); - if (codec != null) + + using(EncoderParameters myEncoderParameters = new EncoderParameters()) { - mTexture.Save(imgstream, codec, myEncoderParameters); - // Write the stream to a byte array for output - data = imgstream.ToArray(); - } - else - m_log.WarnFormat("[GETTEXTURE]: No such codec {0}", format); + myEncoderParameters.Param[0] = new EncoderParameter(Encoder.Quality,95L); + // Save bitmap to stream + ImageCodecInfo codec = GetEncoderInfo("image/" + format); + if (codec != null) + { + mTexture.Save(imgstream, codec, myEncoderParameters); + // Write the stream to a byte array for output + data = imgstream.ToArray(); + } + else + m_log.WarnFormat("[GETTEXTURE]: No such codec {0}", format); + } } } catch (Exception e) @@ -405,6 +406,9 @@ namespace OpenSim.Capabilities.Handlers if (image != null) image.Dispose(); + if(managedImage != null) + managedImage.Clear(); + if (imgstream != null) { imgstream.Close(); diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs index 23409985b4..aad3bd220a 100644 --- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs @@ -159,8 +159,7 @@ namespace OpenSim.Services.Connectors.Hypergrid string filename = string.Empty; try - { - WebClient c = new WebClient(); + { //m_log.Debug("JPEG: " + imageURL); string name = regionID.ToString(); filename = Path.Combine(storagePath, name + ".jpg"); @@ -168,7 +167,8 @@ namespace OpenSim.Services.Connectors.Hypergrid if (!File.Exists(filename)) { m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: downloading..."); - c.DownloadFile(imageURL, filename); + using(WebClient c = new WebClient()) + c.DownloadFile(imageURL, filename); } else { diff --git a/ThirdParty/SmartThreadPool/SmartThreadPool.cs b/ThirdParty/SmartThreadPool/SmartThreadPool.cs index 8e427324f2..297e20ec27 100644 --- a/ThirdParty/SmartThreadPool/SmartThreadPool.cs +++ b/ThirdParty/SmartThreadPool/SmartThreadPool.cs @@ -1485,6 +1485,9 @@ namespace Amib.Threading _isIdleWaitHandle = null; } + if (_stpStartInfo.EnableLocalPerformanceCounters) + _localPCs.Dispose(); + _isDisposed = true; } }