diff --git a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs index 50afe8be53..0ed094b311 100644 --- a/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/VectorRender/VectorRenderModule.cs @@ -55,11 +55,12 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender // private static byte[] s_asset2Data; private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static object thisLock = new object(); + private static Graphics m_graph = null; // just to get chars sizes private Scene m_scene; private IDynamicTextureManager m_textureManager; - private Graphics m_graph; private string m_fontName = "Arial"; public VectorRenderModule() @@ -120,18 +121,15 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender public void GetDrawStringSize(string text, string fontName, int fontSize, out double xSize, out double ySize) { - lock (this) + lock (thisLock) { using (Font myFont = new Font(fontName, fontSize)) { SizeF stringSize = new SizeF(); - // XXX: This lock may be unnecessary. - lock (m_graph) - { - stringSize = m_graph.MeasureString(text, myFont); - xSize = stringSize.Width; - ySize = stringSize.Height; - } + + stringSize = m_graph.MeasureString(text, myFont); + xSize = stringSize.Width; + ySize = stringSize.Height; } } } @@ -151,8 +149,14 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender // We won't dispose of these explicitly since this module is only removed when the entire simulator // is shut down. - Bitmap bitmap = new Bitmap(1024, 1024, PixelFormat.Format32bppArgb); - m_graph = Graphics.FromImage(bitmap); + lock(thisLock) + { + if(m_graph == null) + { + Bitmap bitmap = new Bitmap(32, 32, PixelFormat.Format32bppArgb); + m_graph = Graphics.FromImage(bitmap); + } + } } public void PostInitialise() @@ -404,12 +408,7 @@ namespace OpenSim.Region.CoreModules.Scripting.VectorRender } finally { - // XXX: In testing, it appears that if multiple threads dispose of separate GDI+ objects simultaneously, - // the native malloc heap can become corrupted, possibly due to a double free(). This may be due to - // bugs in the underlying libcairo used by mono's libgdiplus.dll on Linux/OSX. These problems were - // seen with both libcario 1.10.2-6.1ubuntu3 and 1.8.10-2ubuntu1. They go away if disposal is perfomed - // under lock. - lock (this) + lock (thisLock) { if (graph != null) graph.Dispose();