From b51c26ab40579a3e7a21df54b15a72a5c464ae41 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 19 Oct 2012 03:50:00 +0100 Subject: UbitOde stop doing a copy of the asset data using just the reference to it. It costs a lot of cpu and doesn't seem all that usefull. --- OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs index 73dd2fd..5030cec 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs @@ -914,8 +914,9 @@ namespace OpenSim.Region.Physics.OdePlugin if (repData.pbs.SculptTexture != repData.assetID) return; - repData.pbs.SculptData = new byte[asset.Data.Length]; - asset.Data.CopyTo(repData.pbs.SculptData,0); +// repData.pbs.SculptData = new byte[asset.Data.Length]; +// asset.Data.CopyTo(repData.pbs.SculptData,0); + repData.pbs.SculptData = asset.Data; repData.meshState = MeshState.AssetOK; m_worker.AssetLoaded(repData); } -- cgit v1.1 From 3b51cae958df48cd629124e875d7236038f60302 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sat, 20 Oct 2012 17:53:33 +0100 Subject: bug fix --- OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs | 2 ++ OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index ce67cc4..76e42d4 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -1108,6 +1108,8 @@ namespace OpenSim.Region.Physics.OdePlugin ODEPhysRepData repData = _parent_scene.m_meshWorker.NewActorPhysRep(this, _pbs, _size, m_shapetype); primVolume = repData.volume; + m_OBB = repData.OBB; + m_OBBOffset = repData.OBBOffset; UpdatePrimBodyData(); } diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index b98f177..cce8946 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -2344,7 +2344,7 @@ namespace OpenSim.Region.Physics.OdePlugin } } } - IntPtr HeightmapData = d.GeomHeightfieldDataCreate(); + IntPtr HeightmapData = d.GeomUbitTerrainDataCreate(); const int wrap = 0; float thickness = hfmin; -- cgit v1.1 From aa97014ee4563883ddd84dd1607b143394412f49 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 28 Oct 2012 09:51:27 +0000 Subject: Add some extra debug on scene close --- OpenSim/Region/Framework/Scenes/Scene.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 8034bc6..32a7935 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1255,9 +1255,11 @@ namespace OpenSim.Region.Framework.Scenes // Stop all client threads. ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); }); - m_log.Debug("[SCENE]: Persisting changed objects"); + m_log.Debug("[SCENE]: TriggerSceneShuttingDown"); EventManager.TriggerSceneShuttingDown(this); + m_log.Debug("[SCENE]: Persisting changed objects"); + EntityBase[] entities = GetEntities(); foreach (EntityBase entity in entities) { @@ -1267,10 +1269,12 @@ namespace OpenSim.Region.Framework.Scenes } } + m_log.Debug("[SCENE]: Graph close"); m_sceneGraph.Close(); if (PhysicsScene != null) { + m_log.Debug("[SCENE]: Dispose Physics"); PhysicsScene phys = PhysicsScene; // remove the physics engine from both Scene and SceneGraph PhysicsScene = null; @@ -1282,6 +1286,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.WarnFormat("[SCENE]: Deregister from grid failed for region {0}", Name); // call the base class Close method. + m_log.Debug("[SCENE]: Base close"); base.Close(); } @@ -1317,6 +1322,9 @@ namespace OpenSim.Region.Framework.Scenes } // m_lastUpdate = Util.EnvironmentTickCount(); + m_sceneGraph.PreparePhysicsSimulation(); + + m_heartbeatThread = Watchdog.StartThread( Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false); -- cgit v1.1 From e297e90bda74a901dbf473abca3e34e724f999e9 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 28 Oct 2012 09:57:41 +0000 Subject: remove pre physics build testing --- OpenSim/Region/Framework/Scenes/Scene.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 32a7935..ccb4aad 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1322,7 +1322,7 @@ namespace OpenSim.Region.Framework.Scenes } // m_lastUpdate = Util.EnvironmentTickCount(); - m_sceneGraph.PreparePhysicsSimulation(); +// m_sceneGraph.PreparePhysicsSimulation(); m_heartbeatThread -- cgit v1.1 From ad7f273d95b941e5556c875d1a2b6ea1cef34604 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 28 Oct 2012 10:25:58 +0000 Subject: more debug --- OpenSim/Region/Framework/Scenes/EventManager.cs | 2 ++ 1 file changed, 2 insertions(+) (limited to 'OpenSim') diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index eee5960..7916c42 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -2458,6 +2458,7 @@ namespace OpenSim.Region.Framework.Scenes { foreach (Action d in handler.GetInvocationList()) { + m_log.InfoFormat("[EVENT MANAGER]: TriggerSceneShuttingDown invoque {0}", d.Method.Name.ToString()); try { d(s); @@ -2470,6 +2471,7 @@ namespace OpenSim.Region.Framework.Scenes } } } + m_log.Info("[EVENT MANAGER]: TriggerSceneShuttingDown done"); } public void TriggerOnRegionStarted(Scene scene) -- cgit v1.1 From 8bb29054165b1fa3284b200ca6682eb1c81e977f Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 28 Oct 2012 11:55:11 +0000 Subject: test limit ode exec time by time not number of loops done --- OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index cce8946..5e01ff1 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -1714,9 +1714,8 @@ namespace OpenSim.Region.Physics.OdePlugin else curphysiteractions = m_physicsiterations; - int nodeframes = 0; - // checkThread(); + int nodeframes = 0; lock (SimulationLock) lock(OdeLock) @@ -1733,7 +1732,11 @@ namespace OpenSim.Region.Physics.OdePlugin d.WorldSetQuickStepNumIterations(world, curphysiteractions); - while (step_time > HalfOdeStep && nodeframes < 10) //limit number of steps so we don't say here for ever + int loopstartMS = Util.EnvironmentTickCount(); + int looptimeMS = 0; + + + while (step_time > HalfOdeStep) { try { @@ -1742,9 +1745,8 @@ namespace OpenSim.Region.Physics.OdePlugin if (ChangesQueue.Count > 0) { - int ttmpstart = Util.EnvironmentTickCount(); + int changestartMS = Util.EnvironmentTickCount(); int ttmp; - while (ChangesQueue.Dequeue(out item)) { if (item.actor != null) @@ -1762,7 +1764,7 @@ namespace OpenSim.Region.Physics.OdePlugin item.actor.Name, item.what.ToString()); } } - ttmp = Util.EnvironmentTickCountSubtract(ttmpstart); + ttmp = Util.EnvironmentTickCountSubtract(changestartMS); if (ttmp > 20) break; } @@ -1873,9 +1875,12 @@ namespace OpenSim.Region.Physics.OdePlugin // ode.dunlock(world); } - step_time -= ODE_STEPSIZE; nodeframes++; + + looptimeMS = Util.EnvironmentTickCountSubtract(loopstartMS); + if (looptimeMS > 100) + break; } lock (_badCharacter) @@ -1963,7 +1968,7 @@ namespace OpenSim.Region.Physics.OdePlugin // think time dilation as to do with dinamic step size that we dont' have // even so tell something to world - if (nodeframes < 10) // we did the requested loops + if (looptimeMS < 100) // we did the requested loops m_timeDilation = 1.0f; else if (step_time > 0) { -- cgit v1.1 From dd0323d89e9da7121ac85f8997c6f860d9977dd1 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 28 Oct 2012 14:04:39 +0000 Subject: minor change --- OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 1 + 1 file changed, 1 insertion(+) (limited to 'OpenSim') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index 5e01ff1..0194c21 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -1977,6 +1977,7 @@ namespace OpenSim.Region.Physics.OdePlugin m_timeDilation = 1; if (step_time > m_SkipFramesAtms) step_time = 0; + m_lastframe = DateTime.UtcNow; // skip also the time lost } } -- cgit v1.1 From fbe4ec8ee0b56ca4490f5a7439aa287ff37e2e9d Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 28 Oct 2012 14:32:55 +0000 Subject: fix ode timing --- OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index 0194c21..eb0a514 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -1692,7 +1692,6 @@ namespace OpenSim.Region.Physics.OdePlugin DateTime now = DateTime.UtcNow; TimeSpan timedif = now - m_lastframe; - m_lastframe = now; timeStep = (float)timedif.TotalSeconds; // acumulate time so we can reduce error @@ -1704,6 +1703,8 @@ namespace OpenSim.Region.Physics.OdePlugin if (framecount < 0) framecount = 0; + m_lastframe = now; + framecount++; int curphysiteractions; -- cgit v1.1 From db7f4074b51f6c8e6e329cd67fb1e711f2272408 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 28 Oct 2012 14:39:04 +0000 Subject: revert last change --- OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index eb0a514..54bc29f 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -1689,10 +1689,10 @@ namespace OpenSim.Region.Physics.OdePlugin /// public override float Simulate(float timeStep) { - DateTime now = DateTime.UtcNow; TimeSpan timedif = now - m_lastframe; timeStep = (float)timedif.TotalSeconds; + m_lastframe = now; // acumulate time so we can reduce error step_time += timeStep; @@ -1703,7 +1703,6 @@ namespace OpenSim.Region.Physics.OdePlugin if (framecount < 0) framecount = 0; - m_lastframe = now; framecount++; -- cgit v1.1 From 5328808b1825ef7d73809c8ddd67542ee05bf575 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 30 Oct 2012 21:19:00 +0100 Subject: Make sure we're not accessing a physics scene if we're not in one yet. --- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 49b771f..165dd85 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -813,7 +813,7 @@ namespace OpenSim.Region.Framework.Scenes actor.Orientation = GetWorldRotation(); // Tell the physics engines that this prim changed. - if (ParentGroup.Scene != null) + if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene != null) ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); } -- cgit v1.1 From ff61d59e60cf40ed65e01b2788c875509a5aaaa4 Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 30 Oct 2012 21:45:39 +0100 Subject: Add AnimState to CADU --- OpenSim/Framework/ChildAgentDataUpdate.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'OpenSim') diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs index e718aa6..8c32734 100644 --- a/OpenSim/Framework/ChildAgentDataUpdate.cs +++ b/OpenSim/Framework/ChildAgentDataUpdate.cs @@ -312,6 +312,7 @@ namespace OpenSim.Framework public AgentGroupData[] Groups; public Animation[] Anims; public Animation DefaultAnim = null; + public Animation AnimState = null; public UUID GranterID; public UUID ParentPart; @@ -403,6 +404,11 @@ namespace OpenSim.Framework args["default_animation"] = DefaultAnim.PackUpdateMessage(); } + if (AnimState != null) + { + args["animation_state"] = AnimState.PackUpdateMessage(); + } + if (Appearance != null) args["packed_appearance"] = Appearance.Pack(); @@ -612,6 +618,18 @@ namespace OpenSim.Framework } } + if (args["animation_state"] != null) + { + try + { + AnimState = new Animation((OSDMap)args["animation_state"]); + } + catch + { + AnimState = null; + } + } + //if ((args["agent_textures"] != null) && (args["agent_textures"]).Type == OSDType.Array) //{ // OSDArray textures = (OSDArray)(args["agent_textures"]); -- cgit v1.1 From c2639bef8e981e49fef09dfd9c54442ba500e9d4 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 2 Nov 2012 10:14:08 +0000 Subject: lock unique and uniqueReleased in same order when both locks are needed --- OpenSim/Region/Physics/UbitMeshing/Meshmerizer.cs | 34 ++++++++++------------- 1 file changed, 14 insertions(+), 20 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Physics/UbitMeshing/Meshmerizer.cs b/OpenSim/Region/Physics/UbitMeshing/Meshmerizer.cs index 29fdda4..6e1a105 100644 --- a/OpenSim/Region/Physics/UbitMeshing/Meshmerizer.cs +++ b/OpenSim/Region/Physics/UbitMeshing/Meshmerizer.cs @@ -1057,25 +1057,22 @@ namespace OpenSim.Region.Physics.Meshing mesh.RefCount++; return mesh; } - } - // try to find a identical mesh on meshs recently released - lock (m_uniqueReleasedMeshes) - { - m_uniqueReleasedMeshes.TryGetValue(key, out mesh); - if (mesh != null) + // try to find a identical mesh on meshs recently released + lock (m_uniqueReleasedMeshes) { - m_uniqueReleasedMeshes.Remove(key); - lock (m_uniqueMeshes) + m_uniqueReleasedMeshes.TryGetValue(key, out mesh); + if (mesh != null) { + m_uniqueReleasedMeshes.Remove(key); try { m_uniqueMeshes.Add(key, mesh); } catch { } + mesh.RefCount = 1; + return mesh; } - mesh.RefCount = 1; - return mesh; } } return null; @@ -1108,25 +1105,22 @@ namespace OpenSim.Region.Physics.Meshing mesh.RefCount++; return mesh; } - } - // try to find a identical mesh on meshs recently released - lock (m_uniqueReleasedMeshes) - { - m_uniqueReleasedMeshes.TryGetValue(key, out mesh); - if (mesh != null) + // try to find a identical mesh on meshs recently released + lock (m_uniqueReleasedMeshes) { - m_uniqueReleasedMeshes.Remove(key); - lock (m_uniqueMeshes) + m_uniqueReleasedMeshes.TryGetValue(key, out mesh); + if (mesh != null) { + m_uniqueReleasedMeshes.Remove(key); try { m_uniqueMeshes.Add(key, mesh); } catch { } + mesh.RefCount = 1; + return mesh; } - mesh.RefCount = 1; - return mesh; } } -- cgit v1.1 From fd2bee8da19c950b4d9abf5af2f66c172dbc2268 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 2 Nov 2012 16:43:38 +0100 Subject: Squash reporting HelloNeighbor exception - it simply means the other sim is down, no need for yellow ink. --- .../Services/Connectors/Neighbour/NeighbourServicesConnector.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs index 7429293..7688e0f 100644 --- a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs +++ b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs @@ -153,9 +153,9 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.WarnFormat( - "[NEIGHBOUR SERVICE CONNCTOR]: Unable to send HelloNeighbour from {0} to {1}. Exception {2}{3}", - thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); +// m_log.WarnFormat( +// "[NEIGHBOUR SERVICE CONNCTOR]: Unable to send HelloNeighbour from {0} to {1}. Exception {2}{3}", +// thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); return false; } @@ -202,4 +202,4 @@ namespace OpenSim.Services.Connectors return true; } } -} \ No newline at end of file +} -- cgit v1.1 From 9eb39406ad488bb3e2fb6f68685666cdf765d002 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 3 Nov 2012 20:35:09 +0100 Subject: Prevent a null client from crashing windlight. --- OpenSim/Region/CoreModules/LightShare/LightShareModule.cs | 3 +++ 1 file changed, 3 insertions(+) (limited to 'OpenSim') diff --git a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs index f49641f..f524490 100644 --- a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs +++ b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs @@ -153,6 +153,9 @@ namespace OpenSim.Region.CoreModules.World.LightShare public void SendProfileToClient(IClientAPI client, RegionLightShareData wl) { + if (client == null) + return; + if (m_enableWindlight) { if (m_scene.RegionInfo.WindlightSettings.valid) -- cgit v1.1 From 7e91a787fb89e782382bf98c026d8f22d25691a1 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 4 Nov 2012 22:01:34 +0100 Subject: Add a method to query all registered script constants to allow non-XEngine script engines to use them. --- .../Region/Framework/Interfaces/IScriptModuleComms.cs | 2 ++ .../ScriptModuleComms/ScriptModuleCommsModule.cs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) (limited to 'OpenSim') diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs b/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs index ed71a95..a76ffde 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs @@ -27,6 +27,7 @@ using System; using System.Reflection; +using System.Collections.Generic; using OpenMetaverse; namespace OpenSim.Region.Framework.Interfaces @@ -70,6 +71,7 @@ namespace OpenSim.Region.Framework.Interfaces /// For constants void RegisterConstant(string cname, object value); object LookupModConstant(string cname); + Dictionary GetConstants(); // For use ONLY by the script API void RaiseEvent(UUID script, string id, string module, string command, string key); diff --git a/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs b/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs index 705a847..c5c96a9 100644 --- a/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs @@ -302,6 +302,22 @@ namespace OpenSim.Region.OptionalModules.Scripting.ScriptModuleComms return null; } + /// + /// Get all registered constants + /// + public Dictionary GetConstants() + { + Dictionary ret = new Dictionary(); + + lock (m_constants) + { + foreach (KeyValuePair kvp in m_constants) + ret[kvp.Key] = kvp.Value; + } + + return ret; + } + #endregion } -- cgit v1.1