From 2f394b7e7ebf991c7a70f93bf251d26d8043aaa2 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Thu, 22 Oct 2009 01:30:12 -0700
Subject: * Allow SmartThreadPool to be initialized without setting max stack
size (like the original implementation) * Only initialize Util's
SmartThreadPool if it is actually being used * No longer initializing Util's
SmartThreadPool with a custom max stack size. From MSDN: "Avoid using this
constructor overload. The default stack size used by the Thread(ThreadStart)
constructor overload is the recommended stack size for threads."
---
OpenSim/Framework/Util.cs | 12 +++++++-----
OpenSim/Region/Application/OpenSim.cs | 7 ++++++-
ThirdParty/SmartThreadPool/SmartThreadPool.cs | 6 +++++-
bin/OpenSim.ini.example | 14 +++++++++-----
4 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index d09bd6d..167e34d 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -69,8 +69,6 @@ namespace OpenSim.Framework
///
public class Util
{
- private static SmartThreadPool m_ThreadPool = null;
-
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static uint nextXferID = 5000;
@@ -79,6 +77,9 @@ namespace OpenSim.Framework
private static string regexInvalidFileChars = "[" + new String(Path.GetInvalidFileNameChars()) + "]";
private static string regexInvalidPathChars = "[" + new String(Path.GetInvalidPathChars()) + "]";
private static object XferLock = new object();
+ /// Thread pool used for Util.FireAndForget if
+ /// FireAndForgetMethod.SmartThreadPool is used
+ private static SmartThreadPool m_ThreadPool;
// Unix-epoch starts at January 1st 1970, 00:00:00 UTC. And all our times in the server are (or at least should be) in UTC.
private static readonly DateTime unixEpoch =
@@ -1319,8 +1320,11 @@ namespace OpenSim.Framework
FireAndForget(callback, null);
}
- public static void SetMaxThreads(int maxThreads)
+ public static void InitThreadPool(int maxThreads)
{
+ if (maxThreads < 2)
+ throw new ArgumentOutOfRangeException("maxThreads", "maxThreads must be greater than 2");
+
if (m_ThreadPool != null)
return;
@@ -1328,9 +1332,7 @@ namespace OpenSim.Framework
startInfo.IdleTimeout = 2000; // 2 seconds
startInfo.MaxWorkerThreads = maxThreads;
startInfo.MinWorkerThreads = 2;
- startInfo.StackSize = 524288;
startInfo.ThreadPriority = ThreadPriority.Normal;
-
startInfo.StartSuspended = false;
m_ThreadPool = new SmartThreadPool(startInfo);
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index c04b8c2..26298e7 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -67,7 +67,7 @@ namespace OpenSim
IConfig startupConfig = m_config.Source.Configs["Startup"];
- Util.SetMaxThreads(startupConfig.GetInt("MaxPoolThreads", 15));
+ int stpMaxThreads = 15;
if (startupConfig != null)
{
@@ -100,8 +100,13 @@ namespace OpenSim
FireAndForgetMethod asyncCallMethod;
if (!String.IsNullOrEmpty(asyncCallMethodStr) && Utils.EnumTryParse(asyncCallMethodStr, out asyncCallMethod))
Util.FireAndForgetMethod = asyncCallMethod;
+
+ stpMaxThreads = startupConfig.GetInt("MaxPoolThreads", 15);
}
+ if (Util.FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool)
+ Util.InitThreadPool(stpMaxThreads);
+
m_log.Info("[OPENSIM MAIN]: Using async_call_method " + Util.FireAndForgetMethod);
}
diff --git a/ThirdParty/SmartThreadPool/SmartThreadPool.cs b/ThirdParty/SmartThreadPool/SmartThreadPool.cs
index c21984e..bd52f62 100644
--- a/ThirdParty/SmartThreadPool/SmartThreadPool.cs
+++ b/ThirdParty/SmartThreadPool/SmartThreadPool.cs
@@ -499,7 +499,11 @@ namespace Amib.Threading
}
// Create a new thread
- Thread workerThread = new Thread(new ThreadStart(ProcessQueuedItems), _stpStartInfo.StackSize);
+ Thread workerThread;
+ if (_stpStartInfo.StackSize > 0)
+ workerThread = new Thread(ProcessQueuedItems, _stpStartInfo.StackSize);
+ else
+ workerThread = new Thread(ProcessQueuedItems);
// Configure the new thread and start it
workerThread.Name = "STP " + Name + " Thread #" + _threadCounter;
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 79d57d2..08f87d6 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -38,8 +38,15 @@
; Sets the method that OpenSim will use to fire asynchronous
; events. Valid values are UnsafeQueueUserWorkItem,
- ; QueueUserWorkItem, BeginInvoke, SmartThreadPool, and Thread
- ; async_call_method = SmartThreadPool
+ ; QueueUserWorkItem, BeginInvoke, SmartThreadPool, and Thread.
+ ; SmartThreadPool is reported to work well on Mono/Linux, but
+ ; UnsafeQueueUserWorkItem has been benchmarked with better
+ ; performance on .NET/Windows
+ ;async_call_method = SmartThreadPool
+
+ ; Max threads to allocate on the FireAndForget thread pool
+ ; when running with the SmartThreadPool option above
+ MaxPoolThreads = 15
; ##
; ## CLIENTS
@@ -51,9 +58,6 @@
; Set this to the DLL containing the client stack to use.
clientstack_plugin="OpenSim.Region.ClientStack.LindenUDP.dll"
- ; Max threads to allocate on the FireAndForget pool
- MaxPoolThreads = 15
-
; ##
; ## REGIONS
; ##
--
cgit v1.1
From 5d07e18980ce5969b26648332435d9f7e61b22b6 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Thu, 22 Oct 2009 02:27:06 -0700
Subject: A synchronous call to the messaging server was blocking the process
of promoting an agent to a root agent (logins and teleports). Changed to an
async method
---
.../Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs
index ad05bab..f5ab454 100644
--- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs
@@ -274,8 +274,14 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
}
m_RootAgents[agentID] = scene;
}
+
// inform messaging server that agent changed the region
- NotifyMessageServerOfAgentLocation(agentID, scene.RegionInfo.RegionID, scene.RegionInfo.RegionHandle);
+ Util.FireAndForget(
+ delegate(object o)
+ {
+ NotifyMessageServerOfAgentLocation(agentID, scene.RegionInfo.RegionID, scene.RegionInfo.RegionHandle);
+ }
+ );
}
private void OnEconomyDataRequest(UUID agentID)
--
cgit v1.1
From d756fa01aea63e9b50be00a6f1f229ff7afef779 Mon Sep 17 00:00:00 2001
From: Jeff Ames
Date: Thu, 22 Oct 2009 18:57:14 +0900
Subject: Add copyright header. Formatting cleanup.
---
OpenSim/Framework/MinHeap.cs | 27 ++++++++++++++++++++++
.../Region/ClientStack/LindenUDP/LLClientView.cs | 2 +-
2 files changed, 28 insertions(+), 1 deletion(-)
mode change 100755 => 100644 OpenSim/Framework/MinHeap.cs
diff --git a/OpenSim/Framework/MinHeap.cs b/OpenSim/Framework/MinHeap.cs
old mode 100755
new mode 100644
index ad39bbc..33d0364
--- a/OpenSim/Framework/MinHeap.cs
+++ b/OpenSim/Framework/MinHeap.cs
@@ -1,3 +1,30 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
using System;
using System.Threading;
using System.Collections;
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 0ba76ec..5acf25f 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -827,7 +827,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
for (int i = x1; i <= x2; i++)
SendLayerData(i, y1, map);
- // Column
+ // Column
for (int j = y1 + 1; j <= y2; j++)
SendLayerData(x2, j, map);
--
cgit v1.1
From 47d8b6c5f50a494bca520e2a8532c59561339963 Mon Sep 17 00:00:00 2001
From: Snowcrash
Date: Tue, 20 Oct 2009 15:51:19 +0200
Subject: Fix rounding error in PRIM_SIZE portion of llSetPrimitiveParams
---
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 6e17639..c3e89f6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1263,11 +1263,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
protected void SetScale(SceneObjectPart part, LSL_Vector scale)
{
// TODO: this needs to trigger a persistance save as well
-
if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
return;
-
- if (scale.x < 0.01 || scale.y < 0.01 || scale.z < 0.01)
+ // scale.x < 0.01 in a manner which handles rounding errors
+ if (Math.Round(scale.x - 0.01) > 0.0 || Math.Round(scale.y - 0.01) > 0.0 || Math.Round(scale.z - 0.01) > 0.0)
return;
if (part.ParentGroup.RootPart.PhysActor != null && part.ParentGroup.RootPart.PhysActor.IsPhysical)
@@ -1279,12 +1278,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (scale.z > World.m_maxPhys)
scale.z = World.m_maxPhys;
}
+
if (scale.x > World.m_maxNonphys)
scale.x = World.m_maxNonphys;
if (scale.y > World.m_maxNonphys)
scale.y = World.m_maxNonphys;
if (scale.z > World.m_maxNonphys)
scale.z = World.m_maxNonphys;
+
Vector3 tmp = part.Scale;
tmp.X = (float)scale.x;
tmp.Y = (float)scale.y;
--
cgit v1.1
From 84ac0f56f5c6a52f975efa125e9128d559d47d0e Mon Sep 17 00:00:00 2001
From: Snowcrash
Date: Thu, 22 Oct 2009 15:48:21 +0200
Subject: Fixing the patch to the patch
---
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index c3e89f6..435b6e3 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1265,9 +1265,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// TODO: this needs to trigger a persistance save as well
if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
return;
- // scale.x < 0.01 in a manner which handles rounding errors
- if (Math.Round(scale.x - 0.01) > 0.0 || Math.Round(scale.y - 0.01) > 0.0 || Math.Round(scale.z - 0.01) > 0.0)
- return;
+ if (scale.x < 0.01)
+ scale.x = 0.01;
+ if (scale.y < 0.01)
+ scale.y = 0.01;
+ if (scale.z < 0.01)
+ scale.z = 0.01;
if (part.ParentGroup.RootPart.PhysActor != null && part.ParentGroup.RootPart.PhysActor.IsPhysical)
{
--
cgit v1.1
From 5d12170df92b3bfad2862c40da9742fbc3cf219b Mon Sep 17 00:00:00 2001
From: Melanie
Date: Thu, 22 Oct 2009 17:41:42 +0100
Subject: Correct version number after merge
---
OpenSim/Framework/Servers/VersionInfo.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/OpenSim/Framework/Servers/VersionInfo.cs b/OpenSim/Framework/Servers/VersionInfo.cs
index 62e7e92..9f98310 100644
--- a/OpenSim/Framework/Servers/VersionInfo.cs
+++ b/OpenSim/Framework/Servers/VersionInfo.cs
@@ -29,8 +29,8 @@ namespace OpenSim
{
public class VersionInfo
{
- private const string VERSION_NUMBER = "0.6.7";
- private const Flavour VERSION_FLAVOUR = Flavour.RC1;
+ private const string VERSION_NUMBER = "0.6.8";
+ private const Flavour VERSION_FLAVOUR = Flavour.Dev;
public enum Flavour
{
--
cgit v1.1
From 4121a02936b306895840cf1574197b0f6621c19e Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Thu, 22 Oct 2009 10:15:28 -0700
Subject: OpenSim.ini.example had the wrong names for default values in the
[InterestManagement] section. Fixed
---
bin/OpenSim.ini.example | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 08f87d6..6ff70fc 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -1396,12 +1396,13 @@
;TextureDataLimit = 5
[InterestManagement]
- ; This section controls how state updates are prioritized for each client
- UpdatePrioritizationScheme = Distance
- ReprioritizeUpdate = true
- RootUpdateReprioritizationDistance = 10.0
- ChildUpdateReprioritizationDistance = 20.0
- ReprioritizeUpdatesInterval = 5000.0
+ ; This section controls how state updates are prioritized for each client
+ ; Valid values are Time, Distance, and SimpleAngularDistance
+ UpdatePrioritizationScheme = Distance;
+ ReprioritizationEnabled = true;
+ ReprioritizationInterval = 2000.0;
+ RootReprioritizationDistance = 10.0;
+ ChildReprioritizationDistance = 20.0;
;;
;; These are defaults that are overwritten below in [Architecture].
--
cgit v1.1
From 6ca4b0f36622833688136e9ace7d5545063293ba Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Thu, 22 Oct 2009 10:37:11 -0700
Subject: * Added a check if Util.m_ThreadPool is null before trying to use it,
and if so initialize it to sane defaults * Simplified the InitThreadPool()
function
---
OpenSim/Framework/Util.cs | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index 167e34d..a18a827 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -1324,18 +1324,10 @@ namespace OpenSim.Framework
{
if (maxThreads < 2)
throw new ArgumentOutOfRangeException("maxThreads", "maxThreads must be greater than 2");
-
if (m_ThreadPool != null)
- return;
-
- STPStartInfo startInfo = new STPStartInfo();
- startInfo.IdleTimeout = 2000; // 2 seconds
- startInfo.MaxWorkerThreads = maxThreads;
- startInfo.MinWorkerThreads = 2;
- startInfo.ThreadPriority = ThreadPriority.Normal;
- startInfo.StartSuspended = false;
+ throw new InvalidOperationException("SmartThreadPool is already initialized");
- m_ThreadPool = new SmartThreadPool(startInfo);
+ m_ThreadPool = new SmartThreadPool(2000, maxThreads, 2);
}
public static void FireAndForget(System.Threading.WaitCallback callback, object obj)
@@ -1343,20 +1335,22 @@ namespace OpenSim.Framework
switch (FireAndForgetMethod)
{
case FireAndForgetMethod.UnsafeQueueUserWorkItem:
- System.Threading.ThreadPool.UnsafeQueueUserWorkItem(callback, obj);
+ ThreadPool.UnsafeQueueUserWorkItem(callback, obj);
break;
case FireAndForgetMethod.QueueUserWorkItem:
- System.Threading.ThreadPool.QueueUserWorkItem(callback, obj);
+ ThreadPool.QueueUserWorkItem(callback, obj);
break;
case FireAndForgetMethod.BeginInvoke:
FireAndForgetWrapper wrapper = Singleton.GetInstance();
wrapper.FireAndForget(callback, obj);
break;
case FireAndForgetMethod.SmartThreadPool:
+ if (m_ThreadPool != null)
+ m_ThreadPool = new SmartThreadPool(2000, 15, 2);
m_ThreadPool.QueueWorkItem(delegate(object o) { callback(o); return null; }, obj);
break;
case FireAndForgetMethod.Thread:
- System.Threading.Thread thread = new System.Threading.Thread(delegate(object o) { callback(o); });
+ Thread thread = new Thread(delegate(object o) { callback(o); });
thread.Start(obj);
break;
default:
--
cgit v1.1
From 36b0e5e1d3112212ef988a8b2e7c10284c7e9276 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Thu, 22 Oct 2009 11:07:23 -0700
Subject: Terrible typo in the previous commit!
---
OpenSim/Framework/Util.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index a18a827..b96367a 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -1345,7 +1345,7 @@ namespace OpenSim.Framework
wrapper.FireAndForget(callback, obj);
break;
case FireAndForgetMethod.SmartThreadPool:
- if (m_ThreadPool != null)
+ if (m_ThreadPool == null)
m_ThreadPool = new SmartThreadPool(2000, 15, 2);
m_ThreadPool.QueueWorkItem(delegate(object o) { callback(o); return null; }, obj);
break;
--
cgit v1.1
From 227c832d3b86d47c7f097379bef6ff6ede519b72 Mon Sep 17 00:00:00 2001
From: KittoFlora
Date: Thu, 22 Oct 2009 21:14:00 +0200
Subject: Commented out instrumentation in ODEPrim.cs
---
OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 864ea80..f59f0ae 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -1564,6 +1564,8 @@ Console.WriteLine(" JointCreateFixed");
}
else
{
+//Console.WriteLine("Move " + m_primName);
+ if(!d.BodyIsEnabled (Body)) d.BodyEnable (Body); // KF add 161009
// NON-'VEHICLES' are dealt with here
if (d.BodyIsEnabled(Body) && !m_angularlock.IsIdentical(PhysicsVector.Zero, 0.003f))
{
@@ -1592,6 +1594,7 @@ Console.WriteLine(" JointCreateFixed");
if (m_usePID)
{
+//Console.WriteLine("PID " + m_primName);
// KF - this is for object move? eg. llSetPos() ?
//if (!d.BodyIsEnabled(Body))
//d.BodySetForce(Body, 0f, 0f, 0f);
@@ -1663,6 +1666,8 @@ Console.WriteLine(" JointCreateFixed");
// Hover PID Controller needs to be mutually exlusive to MoveTo PID controller
if (m_useHoverPID && !m_usePID)
{
+//Console.WriteLine("Hover " + m_primName);
+
// If we're using the PID controller, then we have no gravity
fz = (-1 * _parent_scene.gravityz) * m_mass;
@@ -1779,6 +1784,7 @@ Console.WriteLine(" JointCreateFixed");
if (fy < nmin)
fy = nmin;
d.BodyAddForce(Body, fx, fy, fz);
+//Console.WriteLine("AddForce " + fx + "," + fy + "," + fz);
}
}
}
@@ -1786,6 +1792,8 @@ Console.WriteLine(" JointCreateFixed");
{ // is not physical, or is not a body or is selected
// _zeroPosition = d.BodyGetPosition(Body);
return;
+//Console.WriteLine("Nothing " + m_primName);
+
}
}
--
cgit v1.1
From b2ed348aa2746fbf034b713d006e40366c479d5a Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Thu, 22 Oct 2009 12:33:23 -0700
Subject: Implemented a Watchdog class. Do not manually create Thread objects
anymore, use Watchdog.StartThread(). While your thread is running call
Watchdog.UpdateThread(). When it is shutting down call
Watchdog.RemoveThread(). Most of the threads in OpenSim have been updated
---
.../Client/MXP/PacketHandler/MXPPacketServer.cs | 5 +-
.../Framework/Servers/HttpServer/BaseHttpServer.cs | 8 -
.../HttpServer/PollServiceRequestManager.cs | 6 +-
OpenSim/Framework/Watchdog.cs | 183 +++++++++++++++++++++
.../UserServer.Modules/MessageServersConnector.cs | 8 +-
OpenSim/Region/Application/OpenSim.cs | 11 ++
.../Region/ClientStack/LindenUDP/LLUDPServer.cs | 19 ++-
.../InterGrid/OpenGridProtocolModule.cs | 15 +-
.../CoreModules/World/Archiver/AssetsRequest.cs | 8 +-
.../CoreModules/World/WorldMap/WorldMapModule.cs | 13 +-
OpenSim/Region/Framework/Scenes/Scene.cs | 20 +--
.../Server/IRCClientView.cs | 10 +-
.../InternetRelayClientView/Server/IRCServer.cs | 7 +-
.../ContentManagementSystem/CMController.cs | 10 +-
.../DotNetEngine/EventQueueThreadClass.cs | 12 +-
.../ScriptEngine/DotNetEngine/MaintenanceThread.cs | 83 +++++-----
.../Api/Implementation/AsyncCommandManager.cs | 8 +-
17 files changed, 306 insertions(+), 120 deletions(-)
create mode 100644 OpenSim/Framework/Watchdog.cs
diff --git a/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs b/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs
index ba9c653..63381a4 100644
--- a/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs
+++ b/OpenSim/Client/MXP/PacketHandler/MXPPacketServer.cs
@@ -85,10 +85,7 @@ namespace OpenSim.Client.MXP.PacketHandler
m_transmitter = new Transmitter(port);
- m_clientThread = new Thread(StartListener);
- m_clientThread.Name = "MXPThread";
- m_clientThread.IsBackground = true;
- m_clientThread.Start();
+ StartListener();
}
public void StartListener()
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index 85d7be2..bec5ed3 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -1559,15 +1559,7 @@ namespace OpenSim.Framework.Servers.HttpServer
public void Start()
{
m_log.Info("[HTTPD]: Starting up HTTP Server");
-
- //m_workerThread = new Thread(new ThreadStart(StartHTTP));
- //m_workerThread.Name = "HttpThread";
- //m_workerThread.IsBackground = true;
- //m_workerThread.Start();
- //ThreadTracker.Add(m_workerThread);
StartHTTP();
-
-
}
private void StartHTTP()
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
index 1c54581..e7a64f7 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceRequestManager.cs
@@ -50,9 +50,7 @@ namespace OpenSim.Framework.Servers.HttpServer
m_WorkerThreadCount = pWorkerThreadCount;
m_workerThreads = new Thread[m_WorkerThreadCount];
m_PollServiceWorkerThreads = new PollServiceWorkerThread[m_WorkerThreadCount];
- m_watcherThread = new Thread(ThreadStart);
-
//startup worker threads
for (uint i=0;i
+ /// Manages launching threads and keeping watch over them for timeouts
+ ///
+ public static class Watchdog
+ {
+ /// Timer interval in milliseconds for the watchdog timer
+ const double WATCHDOG_INTERVAL_MS = 2500.0d;
+ /// Maximum timeout in milliseconds before a thread is considered dead
+ const int WATCHDOG_TIMEOUT_MS = 5000;
+
+ [System.Diagnostics.DebuggerDisplay("{Thread.Name}")]
+ private class ThreadWatchdogInfo
+ {
+ public Thread Thread;
+ public int LastTick;
+
+ public ThreadWatchdogInfo(Thread thread)
+ {
+ Thread = thread;
+ LastTick = Environment.TickCount & Int32.MaxValue;
+ }
+ }
+
+ ///
+ /// This event is called whenever a tracked thread is stopped or
+ /// has not called UpdateThread() in time
+ ///
+ /// The thread that has been identified as dead
+ /// The last time this thread called UpdateThread()
+ public delegate void WatchdogTimeout(Thread thread, int lastTick);
+
+ /// This event is called whenever a tracked thread is
+ /// stopped or has not called UpdateThread() in time
+ public static event WatchdogTimeout OnWatchdogTimeout;
+
+ private static Dictionary m_threads;
+ private static System.Timers.Timer m_watchdogTimer;
+
+ static Watchdog()
+ {
+ m_threads = new Dictionary();
+ m_watchdogTimer = new System.Timers.Timer(WATCHDOG_INTERVAL_MS);
+ m_watchdogTimer.AutoReset = false;
+ m_watchdogTimer.Elapsed += WatchdogTimerElapsed;
+ m_watchdogTimer.Start();
+ }
+
+ ///
+ /// Start a new thread that is tracked by the watchdog timer
+ ///
+ /// The method that will be executed in a new thread
+ /// A name to give to the new thread
+ /// Priority to run the thread at
+ /// True to run this thread as a background
+ /// thread, otherwise false
+ /// The newly created Thread object
+ public static Thread StartThread(ThreadStart start, string name, ThreadPriority priority, bool isBackground)
+ {
+ Thread thread = new Thread(start);
+ thread.Name = name;
+ thread.Priority = priority;
+ thread.IsBackground = isBackground;
+ thread.Start();
+
+ lock (m_threads)
+ m_threads.Add(thread.ManagedThreadId, new ThreadWatchdogInfo(thread));
+
+ return thread;
+ }
+
+ ///
+ /// Marks the current thread as alive
+ ///
+ public static void UpdateThread()
+ {
+ UpdateThread(Thread.CurrentThread.ManagedThreadId);
+ }
+
+ ///
+ /// Marks a thread as alive
+ ///
+ /// The ManagedThreadId of the thread to mark as
+ /// alive
+ public static void UpdateThread(int threadID)
+ {
+ ThreadWatchdogInfo threadInfo;
+
+ lock (m_threads)
+ {
+ if (m_threads.TryGetValue(threadID, out threadInfo))
+ {
+ threadInfo.LastTick = Environment.TickCount & Int32.MaxValue;
+ }
+ }
+ }
+
+ ///
+ /// Stops watchdog tracking on the current thread
+ ///
+ /// True if the thread was removed from the list of tracked
+ /// threads, otherwise false
+ public static bool RemoveThread()
+ {
+ return RemoveThread(Thread.CurrentThread.ManagedThreadId);
+ }
+
+ ///
+ /// Stops watchdog tracking on a thread
+ ///
+ /// The ManagedThreadId of the thread to stop
+ /// tracking
+ /// True if the thread was removed from the list of tracked
+ /// threads, otherwise false
+ public static bool RemoveThread(int threadID)
+ {
+ lock (m_threads)
+ return m_threads.Remove(threadID);
+ }
+
+ private static void WatchdogTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
+ {
+ WatchdogTimeout callback = OnWatchdogTimeout;
+
+ if (callback != null)
+ {
+ ThreadWatchdogInfo timedOut = null;
+
+ lock (m_threads)
+ {
+ int now = Environment.TickCount;
+
+ foreach (ThreadWatchdogInfo threadInfo in m_threads.Values)
+ {
+ if (threadInfo.Thread.ThreadState == ThreadState.Stopped || now - threadInfo.LastTick >= WATCHDOG_TIMEOUT_MS)
+ {
+ timedOut = threadInfo;
+ m_threads.Remove(threadInfo.Thread.ManagedThreadId);
+ break;
+ }
+ }
+ }
+
+ if (timedOut != null)
+ callback(timedOut.Thread, timedOut.LastTick);
+ }
+
+ m_watchdogTimer.Start();
+ }
+ }
+}
diff --git a/OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs b/OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs
index 8ce353c..f24cef6 100644
--- a/OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs
+++ b/OpenSim/Grid/UserServer.Modules/MessageServersConnector.cs
@@ -78,8 +78,6 @@ namespace OpenSim.Grid.UserServer.Modules
private OpenSim.Framework.BlockingQueue m_NotifyQueue =
new OpenSim.Framework.BlockingQueue();
- Thread m_NotifyThread;
-
private IGridServiceCore m_core;
public event AgentLocationDelegate OnAgentLocation;
@@ -96,8 +94,8 @@ namespace OpenSim.Grid.UserServer.Modules
{
m_core = core;
m_core.RegisterInterface(this);
- m_NotifyThread = new Thread(new ThreadStart(NotifyQueueRunner));
- m_NotifyThread.Start();
+
+ Watchdog.StartThread(NotifyQueueRunner, "NotifyQueueRunner", ThreadPriority.Normal, true);
}
public void PostInitialise()
@@ -427,6 +425,8 @@ namespace OpenSim.Grid.UserServer.Modules
{
TellMessageServersAboutUserLogoffInternal(presence.agentID);
}
+
+ Watchdog.UpdateThread();
}
}
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index 26298e7..0366d94 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -172,6 +172,9 @@ namespace OpenSim
m_scriptTimer.Elapsed += RunAutoTimerScript;
}
+ // Hook up to the watchdog timer
+ Watchdog.OnWatchdogTimeout += WatchdogTimeoutHandler;
+
PrintFileToConsole("startuplogo.txt");
// For now, start at the 'root' level by default
@@ -384,6 +387,14 @@ namespace OpenSim
}
}
+ private void WatchdogTimeoutHandler(System.Threading.Thread thread, int lastTick)
+ {
+ int now = Environment.TickCount & Int32.MaxValue;
+
+ m_log.ErrorFormat("[WATCHDOG]: Timeout detected for thread \"{0}\". ThreadState={1}. Last tick was {2}ms ago",
+ thread.Name, thread.ThreadState, now - lastTick);
+ }
+
#region Console Commands
///
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index a9f4b2c..734471e 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -187,14 +187,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
base.Start(m_recvBufferSize, m_asyncPacketHandling);
- // Start the incoming packet processing thread
- Thread incomingThread = new Thread(IncomingPacketHandler);
- incomingThread.Name = "Incoming Packets (" + m_scene.RegionInfo.RegionName + ")";
- incomingThread.Start();
-
- Thread outgoingThread = new Thread(OutgoingPacketHandler);
- outgoingThread.Name = "Outgoing Packets (" + m_scene.RegionInfo.RegionName + ")";
- outgoingThread.Start();
+ // Start the packet processing threads
+ Watchdog.StartThread(IncomingPacketHandler, "Incoming Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false);
+ Watchdog.StartThread(OutgoingPacketHandler, "Outgoing Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false);
}
public new void Stop()
@@ -775,11 +770,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
m_log.Error("[LLUDPSERVER]: Error in the incoming packet handler loop: " + ex.Message, ex);
}
+
+ Watchdog.UpdateThread();
}
if (packetInbox.Count > 0)
m_log.Warn("[LLUDPSERVER]: IncomingPacketHandler is shutting down, dropping " + packetInbox.Count + " packets");
packetInbox.Clear();
+
+ Watchdog.RemoveThread();
}
private void OutgoingPacketHandler()
@@ -842,12 +841,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// token bucket could get more tokens
if (!m_packetSent)
Thread.Sleep((int)TickCountResolution);
+
+ Watchdog.UpdateThread();
}
catch (Exception ex)
{
m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler loop threw an exception: " + ex.Message, ex);
}
}
+
+ Watchdog.RemoveThread();
}
private void ClientOutgoingPacketHandler(IClientAPI client)
diff --git a/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs b/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs
index d636b1c..62500a2 100644
--- a/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs
+++ b/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs
@@ -1208,10 +1208,7 @@ namespace OpenSim.Region.CoreModules.InterGrid
if (homeScene.TryGetAvatar(avatarId,out avatar))
{
KillAUser ku = new KillAUser(avatar,mod);
- Thread ta = new Thread(ku.ShutdownNoLogout);
- ta.IsBackground = true;
- ta.Name = "ShutdownThread";
- ta.Start();
+ Watchdog.StartThread(ku.ShutdownNoLogout, "OGPShutdown", ThreadPriority.Normal, true);
}
}
@@ -1261,7 +1258,13 @@ namespace OpenSim.Region.CoreModules.InterGrid
avToBeKilled.ControllingClient.SendLogoutPacketWhenClosing = false;
- Thread.Sleep(30000);
+ int sleepMS = 30000;
+ while (sleepMS > 0)
+ {
+ Watchdog.UpdateThread();
+ Thread.Sleep(1000);
+ sleepMS -= 1000;
+ }
// test for child agent because they might have come back
if (avToBeKilled.IsChildAgent)
@@ -1270,6 +1273,8 @@ namespace OpenSim.Region.CoreModules.InterGrid
avToBeKilled.ControllingClient.Close();
}
}
+
+ Watchdog.RemoveThread();
}
}
diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
index fe9c8d9..c9fce91 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs
@@ -128,7 +128,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
if (m_repliesRequired == 0)
{
m_requestState = RequestState.Completed;
- PerformAssetsRequestCallback();
+ PerformAssetsRequestCallback(null);
return;
}
@@ -246,9 +246,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
// We want to stop using the asset cache thread asap
// as we now need to do the work of producing the rest of the archive
- Thread newThread = new Thread(PerformAssetsRequestCallback);
- newThread.Name = "OpenSimulator archiving thread post assets receipt";
- newThread.Start();
+ Util.FireAndForget(PerformAssetsRequestCallback);
}
else
{
@@ -265,7 +263,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
///
/// Perform the callback on the original requester of the assets
///
- protected void PerformAssetsRequestCallback()
+ protected void PerformAssetsRequestCallback(object o)
{
try
{
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
index 4e40084..a4bcbad 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
@@ -74,7 +74,6 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
private Dictionary m_blacklistedregions = new Dictionary();
private Dictionary m_cachedRegionMapItemsAddress = new Dictionary();
private List m_rootAgents = new List();
- private Thread mapItemReqThread;
private volatile bool threadrunning = false;
//private int CacheRegionsDistance = 256;
@@ -338,13 +337,10 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
{
if (threadrunning) return;
threadrunning = true;
+
m_log.Debug("[WORLD MAP]: Starting remote MapItem request thread");
- mapItemReqThread = new Thread(new ThreadStart(process));
- mapItemReqThread.IsBackground = true;
- mapItemReqThread.Name = "MapItemRequestThread";
- mapItemReqThread.Priority = ThreadPriority.BelowNormal;
- mapItemReqThread.SetApartmentState(ApartmentState.MTA);
- mapItemReqThread.Start();
+
+ Watchdog.StartThread(process, "MapItemRequestThread", ThreadPriority.BelowNormal, true);
}
///
@@ -461,6 +457,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
OSDMap response = RequestMapItemsAsync("", st.agentID, st.flags, st.EstateID, st.godlike, st.itemtype, st.regionhandle);
RequestMapItemsCompleted(response);
}
+
+ Watchdog.UpdateThread();
}
}
catch (Exception e)
@@ -469,6 +467,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
}
threadrunning = false;
+ Watchdog.RemoveThread();
}
///
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 5005ac9..4b87f92 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -81,8 +81,6 @@ namespace OpenSim.Region.Framework.Scenes
protected Timer m_restartWaitTimer = new Timer();
- protected Thread m_updateEntitiesThread;
-
public SimStatsReporter StatsReporter;
protected List m_regionRestartNotifyList = new List();
@@ -945,11 +943,8 @@ namespace OpenSim.Region.Framework.Scenes
HeartbeatThread = null;
}
m_lastUpdate = Environment.TickCount;
- HeartbeatThread = new Thread(new ParameterizedThreadStart(Heartbeat));
- HeartbeatThread.SetApartmentState(ApartmentState.MTA);
- HeartbeatThread.Name = string.Format("Heartbeat for region {0}", RegionInfo.RegionName);
- HeartbeatThread.Priority = ThreadPriority.AboveNormal;
- HeartbeatThread.Start();
+
+ HeartbeatThread = Watchdog.StartThread(Heartbeat, "Heartbeat for region " + RegionInfo.RegionName, ThreadPriority.Normal, false);
}
///
@@ -976,12 +971,13 @@ namespace OpenSim.Region.Framework.Scenes
///
/// Performs per-frame updates regularly
///
- ///
- ///
- private void Heartbeat(object sender)
+ private void Heartbeat()
{
if (!Monitor.TryEnter(m_heartbeatLock))
+ {
+ Watchdog.RemoveThread();
return;
+ }
try
{
@@ -998,6 +994,8 @@ namespace OpenSim.Region.Framework.Scenes
Monitor.Pulse(m_heartbeatLock);
Monitor.Exit(m_heartbeatLock);
}
+
+ Watchdog.RemoveThread();
}
///
@@ -1146,6 +1144,8 @@ namespace OpenSim.Region.Framework.Scenes
if ((maintc < (m_timespan * 1000)) && maintc > 0)
Thread.Sleep(maintc);
+
+ Watchdog.UpdateThread();
}
}
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index df03b8d..4b0d01a 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -67,9 +67,8 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
{
m_client = client;
m_scene = scene;
-
- Thread loopThread = new Thread(InternalLoop);
- loopThread.Start();
+
+ Watchdog.StartThread(InternalLoop, "IRCClientView", ThreadPriority.Normal, false);
}
private void SendServerCommand(string command)
@@ -102,7 +101,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
{
try
{
- string strbuf = "";
+ string strbuf = String.Empty;
while (m_connected && m_client.Connected)
{
@@ -140,6 +139,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
}
Thread.Sleep(0);
+ Watchdog.UpdateThread();
}
}
catch (IOException)
@@ -156,6 +156,8 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
m_log.Warn("[IRCd] Disconnected client.");
}
+
+ Watchdog.RemoveThread();
}
private void ProcessInMessage(string message, string command)
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCServer.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCServer.cs
index 91ce9f1..eb39026 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCServer.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCServer.cs
@@ -33,6 +33,7 @@ using System.Reflection;
using System.Text;
using System.Threading;
using log4net;
+using OpenSim.Framework;
using OpenSim.Region.Framework.Scenes;
namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
@@ -56,8 +57,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
m_listener.Start(50);
- Thread thread = new Thread(ListenLoop);
- thread.Start();
+ Watchdog.StartThread(ListenLoop, "IRCServer", ThreadPriority.Normal, false);
m_baseScene = baseScene;
}
@@ -72,7 +72,10 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
while (m_running)
{
AcceptClient(m_listener.AcceptTcpClient());
+ Watchdog.UpdateThread();
}
+
+ Watchdog.RemoveThread();
}
private void AcceptClient(TcpClient client)
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMController.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMController.cs
index 16fe9e9..8d6c41d 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMController.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMController.cs
@@ -86,7 +86,6 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
///
Hashtable m_sceneList = Hashtable.Synchronized(new Hashtable());
State m_state = State.NONE;
- Thread m_thread = null;
CMView m_view = null;
#endregion Fields
@@ -148,10 +147,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
lock (this)
{
m_estateModule = scene.RequestModuleInterface();
- m_thread = new Thread(MainLoop);
- m_thread.Name = "Content Management";
- m_thread.IsBackground = true;
- m_thread.Start();
+ Watchdog.StartThread(MainLoop, "Content Management", ThreadPriority.Normal, true);
m_state = State.NONE;
}
}
@@ -200,6 +196,8 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
m_log.Debug("[CONTENT MANAGEMENT] MAIN LOOP -- uuuuuuuuuh, what?");
break;
}
+
+ Watchdog.UpdateThread();
}
}
catch (Exception e)
@@ -209,6 +207,8 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
"[CONTENT MANAGEMENT]: Content management thread terminating with exception. PLEASE REBOOT YOUR SIM - CONTENT MANAGEMENT WILL NOT BE AVAILABLE UNTIL YOU DO. Exception is {0}",
e);
}
+
+ Watchdog.RemoveThread();
}
///
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueThreadClass.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueThreadClass.cs
index 583d2ff..51fd41a 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueThreadClass.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueThreadClass.cs
@@ -132,12 +132,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
///
private void Start()
{
- EventQueueThread = new Thread(EventQueueThreadLoop);
- EventQueueThread.IsBackground = true;
-
- EventQueueThread.Priority = MyThreadPriority;
- EventQueueThread.Name = "EventQueueManagerThread_" + ThreadCount;
- EventQueueThread.Start();
+ EventQueueThread = Watchdog.StartThread(EventQueueThreadLoop, "EventQueueManagerThread_" + ThreadCount, MyThreadPriority, true);
// Look at this... Don't you wish everyone did that solid
// coding everywhere? :P
@@ -184,6 +179,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
while (true)
{
DoProcessQueue();
+ Watchdog.UpdateThread();
}
}
catch (ThreadAbortException)
@@ -214,6 +210,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
m_log.ErrorFormat("[{0}]: Exception {1} thrown", ScriptEngineName, e.GetType().ToString());
throw e;
}
+
+ Watchdog.UpdateThread();
}
}
catch (ThreadAbortException)
@@ -226,6 +224,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
"[{0}]: Event queue thread terminating with exception. PLEASE REBOOT YOUR SIM - SCRIPT EVENTS WILL NOT WORK UNTIL YOU DO. Exception is {1}",
ScriptEngineName, e);
}
+
+ Watchdog.RemoveThread();
}
public void DoProcessQueue()
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/MaintenanceThread.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/MaintenanceThread.cs
index 7ffdb1a..87fdf1f 100644
--- a/OpenSim/Region/ScriptEngine/DotNetEngine/MaintenanceThread.cs
+++ b/OpenSim/Region/ScriptEngine/DotNetEngine/MaintenanceThread.cs
@@ -93,10 +93,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
{
if (MaintenanceThreadThread == null)
{
- MaintenanceThreadThread = new Thread(MaintenanceLoop);
- MaintenanceThreadThread.Name = "ScriptMaintenanceThread";
- MaintenanceThreadThread.IsBackground = true;
- MaintenanceThreadThread.Start();
+ MaintenanceThreadThread = Watchdog.StartThread(MaintenanceLoop, "ScriptMaintenanceThread", ThreadPriority.Normal, true);
}
}
@@ -164,56 +161,54 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
MaintenanceLoopTicks_ScriptLoadUnload_Count++;
MaintenanceLoopTicks_Other_Count++;
-
- //lock (ScriptEngine.ScriptEngines)
- //{
- foreach (ScriptEngine m_ScriptEngine in new ArrayList(ScriptEngine.ScriptEngines))
+ foreach (ScriptEngine m_ScriptEngine in new ArrayList(ScriptEngine.ScriptEngines))
+ {
+ // lastScriptEngine = m_ScriptEngine;
+ // Re-reading config every x seconds
+ if (MaintenanceLoopTicks_Other_Count >= MaintenanceLoopTicks_Other)
{
- // lastScriptEngine = m_ScriptEngine;
- // Re-reading config every x seconds
- if (MaintenanceLoopTicks_Other_Count >= MaintenanceLoopTicks_Other)
+ MaintenanceLoopTicks_Other_ResetCount = true;
+ if (m_ScriptEngine.RefreshConfigFilens > 0)
{
- MaintenanceLoopTicks_Other_ResetCount = true;
- if (m_ScriptEngine.RefreshConfigFilens > 0)
+ // Check if its time to re-read config
+ if (DateTime.Now.Ticks - Last_ReReadConfigFilens >
+ m_ScriptEngine.RefreshConfigFilens)
{
- // Check if its time to re-read config
- if (DateTime.Now.Ticks - Last_ReReadConfigFilens >
- m_ScriptEngine.RefreshConfigFilens)
- {
- //m_log.Debug("Time passed: " + (DateTime.Now.Ticks - Last_ReReadConfigFilens) + ">" + m_ScriptEngine.RefreshConfigFilens);
- // Its time to re-read config file
- m_ScriptEngine.ReadConfig();
- Last_ReReadConfigFilens = DateTime.Now.Ticks; // Reset time
- }
+ //m_log.Debug("Time passed: " + (DateTime.Now.Ticks - Last_ReReadConfigFilens) + ">" + m_ScriptEngine.RefreshConfigFilens);
+ // Its time to re-read config file
+ m_ScriptEngine.ReadConfig();
+ Last_ReReadConfigFilens = DateTime.Now.Ticks; // Reset time
+ }
- // Adjust number of running script threads if not correct
- if (m_ScriptEngine.m_EventQueueManager != null)
- m_ScriptEngine.m_EventQueueManager.AdjustNumberOfScriptThreads();
+ // Adjust number of running script threads if not correct
+ if (m_ScriptEngine.m_EventQueueManager != null)
+ m_ScriptEngine.m_EventQueueManager.AdjustNumberOfScriptThreads();
- // Check if any script has exceeded its max execution time
- if (EventQueueManager.EnforceMaxExecutionTime)
+ // Check if any script has exceeded its max execution time
+ if (EventQueueManager.EnforceMaxExecutionTime)
+ {
+ // We are enforcing execution time
+ if (DateTime.Now.Ticks - Last_maxFunctionExecutionTimens >
+ EventQueueManager.maxFunctionExecutionTimens)
{
- // We are enforcing execution time
- if (DateTime.Now.Ticks - Last_maxFunctionExecutionTimens >
- EventQueueManager.maxFunctionExecutionTimens)
- {
- // Its time to check again
- m_ScriptEngine.m_EventQueueManager.CheckScriptMaxExecTime(); // Do check
- Last_maxFunctionExecutionTimens = DateTime.Now.Ticks; // Reset time
- }
+ // Its time to check again
+ m_ScriptEngine.m_EventQueueManager.CheckScriptMaxExecTime(); // Do check
+ Last_maxFunctionExecutionTimens = DateTime.Now.Ticks; // Reset time
}
}
}
- if (MaintenanceLoopTicks_ScriptLoadUnload_Count >= MaintenanceLoopTicks_ScriptLoadUnload)
- {
- MaintenanceLoopTicks_ScriptLoadUnload_ResetCount = true;
- // LOAD / UNLOAD SCRIPTS
- if (m_ScriptEngine.m_ScriptManager != null)
- m_ScriptEngine.m_ScriptManager.DoScriptLoadUnload();
- }
}
- //}
+ if (MaintenanceLoopTicks_ScriptLoadUnload_Count >= MaintenanceLoopTicks_ScriptLoadUnload)
+ {
+ MaintenanceLoopTicks_ScriptLoadUnload_ResetCount = true;
+ // LOAD / UNLOAD SCRIPTS
+ if (m_ScriptEngine.m_ScriptManager != null)
+ m_ScriptEngine.m_ScriptManager.DoScriptLoadUnload();
+ }
+ }
+
+ Watchdog.UpdateThread();
}
}
catch(ThreadAbortException)
@@ -225,6 +220,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
m_log.ErrorFormat("Exception in MaintenanceLoopThread. Thread will recover after 5 sec throttle. Exception: {0}", ex.ToString());
}
}
+
+ Watchdog.RemoveThread();
}
#endregion
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
index 1607d34..9d97cb2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
@@ -137,11 +137,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (cmdHandlerThread == null)
{
// Start the thread that will be doing the work
- cmdHandlerThread = new Thread(CmdHandlerThreadLoop);
- cmdHandlerThread.Name = "AsyncLSLCmdHandlerThread";
- cmdHandlerThread.Priority = ThreadPriority.BelowNormal;
- cmdHandlerThread.IsBackground = true;
- cmdHandlerThread.Start();
+ cmdHandlerThread = Watchdog.StartThread(CmdHandlerThreadLoop, "AsyncLSLCmdHandlerThread", ThreadPriority.Normal, true);
}
}
@@ -185,6 +181,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
Thread.Sleep(cmdHandlerThreadCycleSleepms);
DoOneCmdHandlerPass();
+
+ Watchdog.UpdateThread();
}
}
catch
--
cgit v1.1
From 167d8e39fa34c52593c640058287184026c95288 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Thu, 22 Oct 2009 13:14:41 -0700
Subject: * Sending (position - hipoffset) instead of position * Sending
m_rotation instead of m_bodyRot in full updates to match terse updates (no
idea which one is right!)
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index d7113bf..99fd86c 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2517,15 +2517,12 @@ namespace OpenSim.Region.Framework.Scenes
if (m_appearance.Texture == null)
return;
- // Note: because Quaternion is a struct, it can't be null
- Quaternion rot = m_bodyRot;
-
Vector3 pos = m_pos;
pos.Z -= m_appearance.HipOffset;
remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid,
- LocalId, m_pos, m_appearance.Texture.GetBytes(),
- m_parentID, rot));
+ LocalId, pos, m_appearance.Texture.GetBytes(),
+ m_parentID, m_bodyRot));
m_scene.StatsReporter.AddAgentUpdates(1);
}
--
cgit v1.1
From 4ba3842d712ccb47e1b7effe0fdf2ed7da531431 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Thu, 22 Oct 2009 13:24:24 -0700
Subject: Forgot to hit save in the last commit
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 99fd86c..cfd3fcc 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2522,7 +2522,7 @@ namespace OpenSim.Region.Framework.Scenes
remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid,
LocalId, pos, m_appearance.Texture.GetBytes(),
- m_parentID, m_bodyRot));
+ m_parentID, m_rotation));
m_scene.StatsReporter.AddAgentUpdates(1);
}
--
cgit v1.1
From ba2972eaf6d608fe4e6a6610089ab9fb8bae3f2d Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Thu, 22 Oct 2009 14:33:54 -0700
Subject: * Send out m_bodyRot everywhere instead of m_rotation. Still have no
clue which is right * Fix WorldMapModule.process() to not trip the watchdog
timer
---
.../CoreModules/World/WorldMap/WorldMapModule.cs | 31 +++++++++++-----------
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 15 +++++------
2 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
index a4bcbad..f4b54aa 100644
--- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs
@@ -58,7 +58,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static readonly string DEFAULT_WORLD_MAP_EXPORT_PATH = "exportmap.jpg";
-
+ private static readonly UUID STOP_UUID = UUID.Random();
private static readonly string m_mapLayerPath = "0001/";
private OpenSim.Framework.BlockingQueue requests = new OpenSim.Framework.BlockingQueue();
@@ -349,7 +349,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
private void StopThread()
{
MapRequestState st = new MapRequestState();
- st.agentID=UUID.Zero;
+ st.agentID=STOP_UUID;
st.EstateID=0;
st.flags=0;
st.godlike=false;
@@ -437,25 +437,26 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
{
while (true)
{
- MapRequestState st = requests.Dequeue();
+ MapRequestState st = requests.Dequeue(1000);
// end gracefully
- if (st.agentID == UUID.Zero)
- {
+ if (st.agentID == STOP_UUID)
break;
- }
- bool dorequest = true;
- lock (m_rootAgents)
+ if (st.agentID != UUID.Zero)
{
- if (!m_rootAgents.Contains(st.agentID))
- dorequest = false;
- }
+ bool dorequest = true;
+ lock (m_rootAgents)
+ {
+ if (!m_rootAgents.Contains(st.agentID))
+ dorequest = false;
+ }
- if (dorequest)
- {
- OSDMap response = RequestMapItemsAsync("", st.agentID, st.flags, st.EstateID, st.godlike, st.itemtype, st.regionhandle);
- RequestMapItemsCompleted(response);
+ if (dorequest)
+ {
+ OSDMap response = RequestMapItemsAsync("", st.agentID, st.flags, st.EstateID, st.godlike, st.itemtype, st.regionhandle);
+ RequestMapItemsCompleted(response);
+ }
}
Watchdog.UpdateThread();
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index cfd3fcc..ccfffe7 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2417,7 +2417,7 @@ namespace OpenSim.Region.Framework.Scenes
pos.Z -= m_appearance.HipOffset;
remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
- pos, m_velocity, Vector3.Zero, m_rotation, Vector4.Zero, m_uuid, null, GetUpdatePriority(remoteClient)));
+ pos, m_velocity, Vector3.Zero, m_bodyRot, Vector4.UnitW, m_uuid, null, GetUpdatePriority(remoteClient)));
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
m_scene.StatsReporter.AddAgentUpdates(1);
@@ -2522,7 +2522,7 @@ namespace OpenSim.Region.Framework.Scenes
remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid,
LocalId, pos, m_appearance.Texture.GetBytes(),
- m_parentID, m_rotation));
+ m_parentID, m_bodyRot));
m_scene.StatsReporter.AddAgentUpdates(1);
}
@@ -2585,14 +2585,11 @@ namespace OpenSim.Region.Framework.Scenes
// the inventory arrives
// m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
- // Note: because Quaternion is a struct, it can't be null
- Quaternion rot = m_bodyRot;
-
Vector3 pos = m_pos;
pos.Z -= m_appearance.HipOffset;
m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
- m_pos, m_appearance.Texture.GetBytes(), m_parentID, rot));
+ pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot));
if (!m_isChildAgent)
{
@@ -2697,9 +2694,11 @@ namespace OpenSim.Region.Framework.Scenes
m_startAnimationSet = true;
}
- Quaternion rot = m_bodyRot;
+ Vector3 pos = m_pos;
+ pos.Z -= m_appearance.HipOffset;
+
m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
- m_pos, m_appearance.Texture.GetBytes(), m_parentID, rot));
+ pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot));
}
--
cgit v1.1
From f34e8adffb7d84df6c9189f69a16699c69e89fa8 Mon Sep 17 00:00:00 2001
From: Teravus Ovares (Dan Olivares)
Date: Thu, 22 Oct 2009 18:28:42 -0400
Subject: * Moved Copyrights above the comments in ODEPrim and ODEDynamics so
they're consistent with the rest (and so chi11ken's auto copyright adding
script doesn't duplicate the copyright.
---
OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs | 25 +++++++++++----------
OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 29 +++++++++++++------------
2 files changed, 28 insertions(+), 26 deletions(-)
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
index 467eba0..019c78b 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
@@ -1,16 +1,4 @@
/*
- * Revised Aug, Sept 2009 by Kitto Flora. ODEDynamics.cs replaces
- * ODEVehicleSettings.cs. It and ODEPrim.cs are re-organised:
- * ODEPrim.cs contains methods dealing with Prim editing, Prim
- * characteristics and Kinetic motion.
- * ODEDynamics.cs contains methods dealing with Prim Physical motion
- * (dynamics) and the associated settings. Old Linear and angular
- * motors for dynamic motion have been replace with MoveLinear()
- * and MoveAngular(); 'Physical' is used only to switch ODE dynamic
- * simualtion on/off; VEHICAL_TYPE_NONE/VEHICAL_TYPE_ is to
- * switch between 'VEHICLE' parameter use and general dynamics
- * settings use.
- *
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
@@ -37,6 +25,19 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+/* Revised Aug, Sept 2009 by Kitto Flora. ODEDynamics.cs replaces
+ * ODEVehicleSettings.cs. It and ODEPrim.cs are re-organised:
+ * ODEPrim.cs contains methods dealing with Prim editing, Prim
+ * characteristics and Kinetic motion.
+ * ODEDynamics.cs contains methods dealing with Prim Physical motion
+ * (dynamics) and the associated settings. Old Linear and angular
+ * motors for dynamic motion have been replace with MoveLinear()
+ * and MoveAngular(); 'Physical' is used only to switch ODE dynamic
+ * simualtion on/off; VEHICAL_TYPE_NONE/VEHICAL_TYPE_ is to
+ * switch between 'VEHICLE' parameter use and general dynamics
+ * settings use.
+ */
+
using System;
using System.Collections.Generic;
using System.Reflection;
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index f59f0ae..412f84d 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -1,18 +1,5 @@
-/*
- * Revised August 26 2009 by Kitto Flora. ODEDynamics.cs replaces
- * ODEVehicleSettings.cs. It and ODEPrim.cs are re-organised:
- * ODEPrim.cs contains methods dealing with Prim editing, Prim
- * characteristics and Kinetic motion.
- * ODEDynamics.cs contains methods dealing with Prim Physical motion
- * (dynamics) and the associated settings. Old Linear and angular
- * motors for dynamic motion have been replace with MoveLinear()
- * and MoveAngular(); 'Physical' is used only to switch ODE dynamic
- * simualtion on/off; VEHICAL_TYPE_NONE/VEHICAL_TYPE_ is to
- * switch between 'VEHICLE' parameter use and general dynamics
- * settings use.
- * Copyright (c) Contributors, http://opensimulator.org/
+/* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
@@ -35,6 +22,20 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
+/*
+ * Revised August 26 2009 by Kitto Flora. ODEDynamics.cs replaces
+ * ODEVehicleSettings.cs. It and ODEPrim.cs are re-organised:
+ * ODEPrim.cs contains methods dealing with Prim editing, Prim
+ * characteristics and Kinetic motion.
+ * ODEDynamics.cs contains methods dealing with Prim Physical motion
+ * (dynamics) and the associated settings. Old Linear and angular
+ * motors for dynamic motion have been replace with MoveLinear()
+ * and MoveAngular(); 'Physical' is used only to switch ODE dynamic
+ * simualtion on/off; VEHICAL_TYPE_NONE/VEHICAL_TYPE_ is to
+ * switch between 'VEHICLE' parameter use and general dynamics
+ * settings use.
+ */
using System;
using System.Collections.Generic;
using System.Reflection;
--
cgit v1.1
From 96d53f11e554f37c135fa2d009f9ffed1a5ec724 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Thu, 22 Oct 2009 17:03:13 -0700
Subject: Added VS2010 support to Prebuild and created runprebuild2010.bat
---
Prebuild/src/Core/Nodes/ProjectNode.cs | 4 +
Prebuild/src/Core/Targets/VS2008Target.cs | 2 +-
Prebuild/src/Core/Targets/VS2010Target.cs | 134 +++++++++++++++++++++++++++
Prebuild/src/Core/Targets/VSGenericTarget.cs | 2 +-
Prebuild/src/Core/Targets/VSVersion.cs | 6 +-
bin/Prebuild.exe | Bin 246272 -> 237568 bytes
prebuild.xml | 2 +-
runprebuild2010.bat | 2 +
8 files changed, 148 insertions(+), 4 deletions(-)
create mode 100644 Prebuild/src/Core/Targets/VS2010Target.cs
create mode 100644 runprebuild2010.bat
diff --git a/Prebuild/src/Core/Nodes/ProjectNode.cs b/Prebuild/src/Core/Nodes/ProjectNode.cs
index 0a24abf..04af7a3 100644
--- a/Prebuild/src/Core/Nodes/ProjectNode.cs
+++ b/Prebuild/src/Core/Nodes/ProjectNode.cs
@@ -90,6 +90,10 @@ namespace Prebuild.Core.Nodes
/// .NET 3.5
///
v3_5,
+ ///
+ /// .NET 4.0
+ ///
+ v4_0,
}
///
/// The Node object representing /Prebuild/Solution/Project elements
diff --git a/Prebuild/src/Core/Targets/VS2008Target.cs b/Prebuild/src/Core/Targets/VS2008Target.cs
index f30017b..e685962 100644
--- a/Prebuild/src/Core/Targets/VS2008Target.cs
+++ b/Prebuild/src/Core/Targets/VS2008Target.cs
@@ -120,7 +120,7 @@ namespace Prebuild.Core.Targets
#region Constructors
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
public VS2008Target()
: base()
diff --git a/Prebuild/src/Core/Targets/VS2010Target.cs b/Prebuild/src/Core/Targets/VS2010Target.cs
new file mode 100644
index 0000000..8772d18
--- /dev/null
+++ b/Prebuild/src/Core/Targets/VS2010Target.cs
@@ -0,0 +1,134 @@
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.IO;
+using System.Text;
+
+using Prebuild.Core.Attributes;
+using Prebuild.Core.Interfaces;
+using Prebuild.Core.Nodes;
+using Prebuild.Core.Utilities;
+using System.CodeDom.Compiler;
+
+namespace Prebuild.Core.Targets
+{
+
+ ///
+ ///
+ ///
+ [Target("vs2010")]
+ public class VS2010Target : VSGenericTarget
+ {
+ #region Fields
+ string solutionVersion = "11.00";
+ string productVersion = "9.0.21022";
+ string schemaVersion = "2.0";
+ string versionName = "Visual Studio 2010";
+ string name = "vs2008";
+ VSVersion version = VSVersion.VS10;
+
+ Hashtable tools;
+ Kernel kernel;
+
+ ///
+ /// Gets or sets the solution version.
+ ///
+ /// The solution version.
+ public override string SolutionVersion
+ {
+ get
+ {
+ return solutionVersion;
+ }
+ }
+ ///
+ /// Gets or sets the product version.
+ ///
+ /// The product version.
+ public override string ProductVersion
+ {
+ get
+ {
+ return productVersion;
+ }
+ }
+ ///
+ /// Gets or sets the schema version.
+ ///
+ /// The schema version.
+ public override string SchemaVersion
+ {
+ get
+ {
+ return schemaVersion;
+ }
+ }
+ ///
+ /// Gets or sets the name of the version.
+ ///
+ /// The name of the version.
+ public override string VersionName
+ {
+ get
+ {
+ return versionName;
+ }
+ }
+ ///
+ /// Gets or sets the version.
+ ///
+ /// The version.
+ public override VSVersion Version
+ {
+ get
+ {
+ return version;
+ }
+ }
+ ///
+ /// Gets the name.
+ ///
+ /// The name.
+ public override string Name
+ {
+ get
+ {
+ return name;
+ }
+ }
+
+ protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion)
+ {
+ switch (frameworkVersion)
+ {
+ case FrameworkVersion.v4_0:
+ return "ToolsVersion=\"4.0\"";
+ case FrameworkVersion.v3_5:
+ return "ToolsVersion=\"3.5\"";
+ case FrameworkVersion.v3_0:
+ return "ToolsVersion=\"3.0\"";
+ default:
+ return "ToolsVersion=\"2.0\"";
+ }
+ }
+
+ public override string SolutionTag
+ {
+ get { return "# Visual Studio 2010"; }
+ }
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public VS2010Target()
+ : base()
+ {
+ }
+
+ #endregion
+ }
+}
diff --git a/Prebuild/src/Core/Targets/VSGenericTarget.cs b/Prebuild/src/Core/Targets/VSGenericTarget.cs
index 84f1df5..fdcc2b9 100644
--- a/Prebuild/src/Core/Targets/VSGenericTarget.cs
+++ b/Prebuild/src/Core/Targets/VSGenericTarget.cs
@@ -173,7 +173,7 @@ namespace Prebuild.Core.Targets
#region Project File
using (ps)
{
- ps.WriteLine("", GetToolsVersionXml(project.FrameworkVersion));
+ ps.WriteLine("", this.Version == VSVersion.VS10 ? "4.0" : "3.5");
ps.WriteLine(" ");
ps.WriteLine(" Local");
ps.WriteLine(" {0}", this.ProductVersion);
diff --git a/Prebuild/src/Core/Targets/VSVersion.cs b/Prebuild/src/Core/Targets/VSVersion.cs
index f477086..59549b0 100644
--- a/Prebuild/src/Core/Targets/VSVersion.cs
+++ b/Prebuild/src/Core/Targets/VSVersion.cs
@@ -45,6 +45,10 @@ namespace Prebuild.Core.Targets
///
/// Visual Studio 2008
///
- VS90
+ VS90,
+ ///
+ /// Visual Studio 2010
+ ///
+ VS10
}
}
diff --git a/bin/Prebuild.exe b/bin/Prebuild.exe
index e58657c..eb4c224 100755
Binary files a/bin/Prebuild.exe and b/bin/Prebuild.exe differ
diff --git a/prebuild.xml b/prebuild.xml
index 81f907d..1c44ebf 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -3135,7 +3135,7 @@
-
+
../../../bin/
diff --git a/runprebuild2010.bat b/runprebuild2010.bat
new file mode 100644
index 0000000..8c832b3
--- /dev/null
+++ b/runprebuild2010.bat
@@ -0,0 +1,2 @@
+bin\Prebuild.exe /target vs2010
+echo C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild OpenSim.sln > compile.bat
--
cgit v1.1
From 588361e2a2398b963871762c2b5485c6a086cf47 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Fri, 23 Oct 2009 01:02:36 -0700
Subject: Experimental change to use an immutable array for iterating
ScenePresences, avoiding locking and copying the list each time it is
accessed
---
.../Region/ClientStack/LindenUDP/LLClientView.cs | 141 +++++++++---------
.../CoreModules/Avatar/Combat/CombatModule.cs | 8 +-
.../CoreModules/Avatar/Dialog/DialogModule.cs | 17 ++-
.../World/Estate/EstateManagementModule.cs | 7 +-
OpenSim/Region/Framework/Scenes/Scene.cs | 25 ++--
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 160 +++++++++++----------
OpenSim/Region/Framework/Scenes/SceneManager.cs | 53 +++----
.../Region/Framework/Scenes/SceneObjectGroup.cs | 4 +-
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 121 ++++++++--------
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 21 +--
.../Shared/Api/Implementation/LSL_Api.cs | 8 +-
.../Api/Implementation/Plugins/SensorRepeat.cs | 13 +-
.../Region/UserStatistics/ActiveConnectionsAJAX.cs | 14 +-
13 files changed, 308 insertions(+), 284 deletions(-)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 5acf25f..e81ff4b 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -4434,6 +4434,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
protected virtual void RegisterLocalPacketHandlers()
{
AddLocalPacketHandler(PacketType.LogoutRequest, Logout);
+ AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate);
AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect);
AddLocalPacketHandler(PacketType.AgentCachedTexture, AgentTextureCached);
AddLocalPacketHandler(PacketType.MultipleObjectUpdate, MultipleObjUpdate);
@@ -4446,6 +4447,75 @@ namespace OpenSim.Region.ClientStack.LindenUDP
#region Packet Handlers
+ private bool HandleAgentUpdate(IClientAPI sener, Packet Pack)
+ {
+ if (OnAgentUpdate != null)
+ {
+ bool update = false;
+ AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack;
+
+ #region Packet Session and User Check
+ if (agenUpdate.AgentData.SessionID != SessionId || agenUpdate.AgentData.AgentID != AgentId)
+ return false;
+ #endregion
+
+ AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData;
+
+ // We can only check when we have something to check
+ // against.
+
+ if (lastarg != null)
+ {
+ update =
+ (
+ (x.BodyRotation != lastarg.BodyRotation) ||
+ (x.CameraAtAxis != lastarg.CameraAtAxis) ||
+ (x.CameraCenter != lastarg.CameraCenter) ||
+ (x.CameraLeftAxis != lastarg.CameraLeftAxis) ||
+ (x.CameraUpAxis != lastarg.CameraUpAxis) ||
+ (x.ControlFlags != lastarg.ControlFlags) ||
+ (x.Far != lastarg.Far) ||
+ (x.Flags != lastarg.Flags) ||
+ (x.State != lastarg.State) ||
+ (x.HeadRotation != lastarg.HeadRotation) ||
+ (x.SessionID != lastarg.SessionID) ||
+ (x.AgentID != lastarg.AgentID)
+ );
+ }
+ else
+ update = true;
+
+ // These should be ordered from most-likely to
+ // least likely to change. I've made an initial
+ // guess at that.
+
+ if (update)
+ {
+ AgentUpdateArgs arg = new AgentUpdateArgs();
+ arg.AgentID = x.AgentID;
+ arg.BodyRotation = x.BodyRotation;
+ arg.CameraAtAxis = x.CameraAtAxis;
+ arg.CameraCenter = x.CameraCenter;
+ arg.CameraLeftAxis = x.CameraLeftAxis;
+ arg.CameraUpAxis = x.CameraUpAxis;
+ arg.ControlFlags = x.ControlFlags;
+ arg.Far = x.Far;
+ arg.Flags = x.Flags;
+ arg.HeadRotation = x.HeadRotation;
+ arg.SessionID = x.SessionID;
+ arg.State = x.State;
+ UpdateAgent handlerAgentUpdate = OnAgentUpdate;
+ lastarg = arg; // save this set of arguments for nexttime
+ if (handlerAgentUpdate != null)
+ OnAgentUpdate(this, arg);
+
+ handlerAgentUpdate = null;
+ }
+ }
+
+ return true;
+ }
+
private bool HandleMoneyTransferRequest(IClientAPI sender, Packet Pack)
{
MoneyTransferRequestPacket money = (MoneyTransferRequestPacket)Pack;
@@ -5631,77 +5701,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
break;
- case PacketType.AgentUpdate:
- if (OnAgentUpdate != null)
- {
- bool update = false;
- AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack;
-
- #region Packet Session and User Check
- if (m_checkPackets)
- {
- if (agenUpdate.AgentData.SessionID != SessionId ||
- agenUpdate.AgentData.AgentID != AgentId)
- break;
- }
- #endregion
-
- AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData;
-
- // We can only check when we have something to check
- // against.
-
- if (lastarg != null)
- {
- update =
- (
- (x.BodyRotation != lastarg.BodyRotation) ||
- (x.CameraAtAxis != lastarg.CameraAtAxis) ||
- (x.CameraCenter != lastarg.CameraCenter) ||
- (x.CameraLeftAxis != lastarg.CameraLeftAxis) ||
- (x.CameraUpAxis != lastarg.CameraUpAxis) ||
- (x.ControlFlags != lastarg.ControlFlags) ||
- (x.Far != lastarg.Far) ||
- (x.Flags != lastarg.Flags) ||
- (x.State != lastarg.State) ||
- (x.HeadRotation != lastarg.HeadRotation) ||
- (x.SessionID != lastarg.SessionID) ||
- (x.AgentID != lastarg.AgentID)
- );
- }
- else
- update = true;
-
- // These should be ordered from most-likely to
- // least likely to change. I've made an initial
- // guess at that.
-
- if (update)
- {
- AgentUpdateArgs arg = new AgentUpdateArgs();
- arg.AgentID = x.AgentID;
- arg.BodyRotation = x.BodyRotation;
- arg.CameraAtAxis = x.CameraAtAxis;
- arg.CameraCenter = x.CameraCenter;
- arg.CameraLeftAxis = x.CameraLeftAxis;
- arg.CameraUpAxis = x.CameraUpAxis;
- arg.ControlFlags = x.ControlFlags;
- arg.Far = x.Far;
- arg.Flags = x.Flags;
- arg.HeadRotation = x.HeadRotation;
- arg.SessionID = x.SessionID;
- arg.State = x.State;
- UpdateAgent handlerAgentUpdate = OnAgentUpdate;
- lastarg = arg; // save this set of arguments for nexttime
- if (handlerAgentUpdate != null)
- OnAgentUpdate(this, arg);
-
- handlerAgentUpdate = null;
- }
-
- }
- break;
-
case PacketType.AgentAnimation:
AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;
diff --git a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs
index 9387bce..61b6d65 100644
--- a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs
@@ -96,12 +96,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule
else
{
bool foundResult = false;
- string resultstring = "";
- List allav = DeadAvatar.Scene.GetScenePresences();
+ string resultstring = String.Empty;
+ ScenePresence[] allav = DeadAvatar.Scene.GetScenePresences();
try
{
- foreach (ScenePresence av in allav)
+ for (int i = 0; i < allav.Length; i++)
{
+ ScenePresence av = allav[i];
+
if (av.LocalId == killerObjectLocalID)
{
av.ControllingClient.SendAlertMessage("You fragged " + DeadAvatar.Firstname + " " + DeadAvatar.Lastname);
diff --git a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
index ebebaf9..72ec869 100644
--- a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs
@@ -85,10 +85,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
public void SendAlertToUser(string firstName, string lastName, string message, bool modal)
{
- List presenceList = m_scene.GetScenePresences();
+ ScenePresence[] presenceList = m_scene.GetScenePresences();
- foreach (ScenePresence presence in presenceList)
+ for (int i = 0; i < presenceList.Length; i++)
{
+ ScenePresence presence = presenceList[i];
+
if (presence.Firstname == firstName && presence.Lastname == lastName)
{
presence.ControllingClient.SendAgentAlertMessage(message, modal);
@@ -99,10 +101,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
public void SendGeneralAlert(string message)
{
- List presenceList = m_scene.GetScenePresences();
+ ScenePresence[] presenceList = m_scene.GetScenePresences();
- foreach (ScenePresence presence in presenceList)
+ for (int i = 0; i < presenceList.Length; i++)
{
+ ScenePresence presence = presenceList[i];
+
if (!presence.IsChildAgent)
presence.ControllingClient.SendAlertMessage(message);
}
@@ -150,10 +154,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
public void SendNotificationToUsersInRegion(
UUID fromAvatarID, string fromAvatarName, string message)
{
- List presenceList = m_scene.GetScenePresences();
+ ScenePresence[] presences = m_scene.GetScenePresences();
- foreach (ScenePresence presence in presenceList)
+ for (int i = 0; i < presences.Length; i++)
{
+ ScenePresence presence = presences[i];
if (!presence.IsChildAgent)
presence.ControllingClient.SendBlueBoxMessage(fromAvatarID, fromAvatarName, message);
}
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index 3bb162e..e3a395e 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -414,9 +414,12 @@ namespace OpenSim.Region.CoreModules.World.Estate
private void handleEstateTeleportAllUsersHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID)
{
// Get a fresh list that will not change as people get teleported away
- List prescences = m_scene.GetScenePresences();
- foreach (ScenePresence p in prescences)
+ ScenePresence[] presences = m_scene.GetScenePresences();
+
+ for (int i = 0; i < presences.Length; i++)
{
+ ScenePresence p = presences[i];
+
if (p.UUID != senderID)
{
// make sure they are still there, we could be working down a long list
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 4b87f92..d5e3445 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -253,7 +253,7 @@ namespace OpenSim.Region.Framework.Scenes
protected int m_fps = 10;
protected int m_frame = 0;
protected float m_timespan = 0.089f;
- protected DateTime m_lastupdate = DateTime.Now;
+ protected DateTime m_lastupdate = DateTime.UtcNow;
private int m_update_physics = 1;
private int m_update_entitymovement = 1;
@@ -1014,7 +1014,7 @@ namespace OpenSim.Region.Framework.Scenes
//#endif
maintc = Environment.TickCount;
- TimeSpan SinceLastFrame = DateTime.Now - m_lastupdate;
+ TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate;
float physicsFPS = 0;
frameMS = Environment.TickCount;
@@ -1137,7 +1137,7 @@ namespace OpenSim.Region.Framework.Scenes
}
m_timedilation = tmpval;
- m_lastupdate = DateTime.Now;
+ m_lastupdate = DateTime.UtcNow;
}
maintc = Environment.TickCount - maintc;
maintc = (int)(m_timespan * 1000) - maintc;
@@ -3496,9 +3496,7 @@ namespace OpenSim.Region.Framework.Scenes
public virtual void AgentCrossing(UUID agentID, Vector3 position, bool isFlying)
{
ScenePresence presence;
-
- lock (m_sceneGraph.ScenePresences)
- m_sceneGraph.ScenePresences.TryGetValue(agentID, out presence);
+ m_sceneGraph.TryGetAvatar(agentID, out presence);
if (presence != null)
{
@@ -3709,8 +3707,7 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 lookAt, uint teleportFlags)
{
ScenePresence sp;
- lock (m_sceneGraph.ScenePresences)
- m_sceneGraph.ScenePresences.TryGetValue(remoteClient.AgentId, out sp);
+ m_sceneGraph.TryGetAvatar(remoteClient.AgentId, out sp);
if (sp != null)
{
@@ -4112,7 +4109,7 @@ namespace OpenSim.Region.Framework.Scenes
/// This list is a new object, so it can be iterated over without locking.
///
///
- public List GetScenePresences()
+ public ScenePresence[] GetScenePresences()
{
return m_sceneGraph.GetScenePresences();
}
@@ -4159,15 +4156,13 @@ namespace OpenSim.Region.Framework.Scenes
public void ForEachScenePresence(Action action)
{
// We don't want to try to send messages if there are no avatars.
- if (m_sceneGraph != null && m_sceneGraph.ScenePresences != null)
+ if (m_sceneGraph != null)
{
try
{
- List presenceList = GetScenePresences();
- foreach (ScenePresence presence in presenceList)
- {
- action(presence);
- }
+ ScenePresence[] presences = GetScenePresences();
+ for (int i = 0; i < presences.Length; i++)
+ action(presences[i]);
}
catch (Exception e)
{
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index deee6c3..db055f9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -66,7 +66,9 @@ namespace OpenSim.Region.Framework.Scenes
#region Fields
- protected internal Dictionary ScenePresences = new Dictionary();
+ protected Dictionary m_scenePresences = new Dictionary();
+ protected ScenePresence[] m_scenePresenceArray = new ScenePresence[0];
+
// SceneObjects is not currently populated or used.
//public Dictionary SceneObjects;
protected internal EntityManager Entities = new EntityManager();
@@ -126,10 +128,12 @@ namespace OpenSim.Region.Framework.Scenes
protected internal void Close()
{
- lock (ScenePresences)
+ lock (m_scenePresences)
{
- ScenePresences.Clear();
+ m_scenePresences.Clear();
+ m_scenePresenceArray = new ScenePresence[0];
}
+
lock (m_dictionary_lock)
{
SceneObjectGroupsByFullID.Clear();
@@ -157,11 +161,9 @@ namespace OpenSim.Region.Framework.Scenes
protected internal void UpdatePresences()
{
- List updateScenePresences = GetScenePresences();
- foreach (ScenePresence pres in updateScenePresences)
- {
- pres.Update();
- }
+ ScenePresence[] updateScenePresences = GetScenePresences();
+ for (int i = 0; i < updateScenePresences.Length; i++)
+ updateScenePresences[i].Update();
}
protected internal float UpdatePhysics(double elapsed)
@@ -190,15 +192,9 @@ namespace OpenSim.Region.Framework.Scenes
protected internal void UpdateScenePresenceMovement()
{
- List moveEntities = GetScenePresences();
-
- foreach (EntityBase entity in moveEntities)
- {
- //cfk. This throws occaisional exceptions on a heavily used region
- //and I added this null check to try to preclude the exception.
- if (entity != null)
- entity.UpdateMovement();
- }
+ ScenePresence[] moveEntities = GetScenePresences();
+ for (int i = 0; i < moveEntities.Length; i++)
+ moveEntities[i].UpdateMovement();
}
#endregion
@@ -645,9 +641,34 @@ namespace OpenSim.Region.Framework.Scenes
Entities[presence.UUID] = presence;
- lock (ScenePresences)
+ lock (m_scenePresences)
{
- ScenePresences[presence.UUID] = presence;
+ if (!m_scenePresences.ContainsKey(presence.UUID))
+ {
+ m_scenePresences.Add(presence.UUID, presence);
+
+ // Create a new array of ScenePresence references
+ int oldLength = m_scenePresenceArray.Length;
+ ScenePresence[] newArray = new ScenePresence[oldLength + 1];
+ Array.Copy(m_scenePresenceArray, newArray, oldLength);
+ newArray[oldLength] = presence;
+ m_scenePresenceArray = newArray;
+ }
+ else
+ {
+ m_scenePresences[presence.UUID] = presence;
+
+ // Do a linear search through the array of ScenePresence references
+ // and update the modified entry
+ for (int i = 0; i < m_scenePresenceArray.Length; i++)
+ {
+ if (m_scenePresenceArray[i].UUID == presence.UUID)
+ {
+ m_scenePresenceArray[i] = presence;
+ break;
+ }
+ }
+ }
}
}
@@ -663,16 +684,30 @@ namespace OpenSim.Region.Framework.Scenes
agentID);
}
- lock (ScenePresences)
+ lock (m_scenePresences)
{
- if (!ScenePresences.Remove(agentID))
+ if (m_scenePresences.Remove(agentID))
+ {
+ // Copy all of the elements from the previous array
+ // into the new array except the removed element
+ int oldLength = m_scenePresenceArray.Length;
+ ScenePresence[] newArray = new ScenePresence[oldLength - 1];
+ int j = 0;
+ for (int i = 0; i < m_scenePresenceArray.Length; i++)
+ {
+ ScenePresence presence = m_scenePresenceArray[i];
+ if (presence.UUID != agentID)
+ {
+ newArray[j] = presence;
+ ++j;
+ }
+ }
+ m_scenePresenceArray = newArray;
+ }
+ else
{
m_log.WarnFormat("[SCENE] Tried to remove non-existent scene presence with agent ID {0} from scene ScenePresences list", agentID);
}
-// else
-// {
-// m_log.InfoFormat("[SCENE] Removed scene presence {0} from scene presences list", agentID);
-// }
}
}
@@ -704,20 +739,21 @@ namespace OpenSim.Region.Framework.Scenes
public void RecalculateStats()
{
- List SPList = GetScenePresences();
+ ScenePresence[] presences = GetScenePresences();
int rootcount = 0;
int childcount = 0;
- foreach (ScenePresence user in SPList)
+ for (int i = 0; i < presences.Length; i++)
{
+ ScenePresence user = presences[i];
if (user.IsChildAgent)
- childcount++;
+ ++childcount;
else
- rootcount++;
+ ++rootcount;
}
+
m_numRootAgents = rootcount;
m_numChildAgents = childcount;
-
}
public int GetChildAgentCount()
@@ -767,12 +803,9 @@ namespace OpenSim.Region.Framework.Scenes
/// locking is required to iterate over it.
///
///
- protected internal List GetScenePresences()
+ protected internal ScenePresence[] GetScenePresences()
{
- lock (ScenePresences)
- {
- return new List(ScenePresences.Values);
- }
+ return m_scenePresenceArray;
}
protected internal List GetAvatars()
@@ -817,14 +850,13 @@ namespace OpenSim.Region.Framework.Scenes
// No locking of scene presences here since we're passing back a list...
List result = new List();
- List ScenePresencesList = GetScenePresences();
+ ScenePresence[] scenePresences = GetScenePresences();
- foreach (ScenePresence avatar in ScenePresencesList)
+ for (int i = 0; i < scenePresences.Length; i++)
{
+ ScenePresence avatar = scenePresences[i];
if (filter(avatar))
- {
result.Add(avatar);
- }
}
return result;
@@ -839,9 +871,9 @@ namespace OpenSim.Region.Framework.Scenes
{
ScenePresence sp;
- lock (ScenePresences)
+ lock (m_scenePresences)
{
- ScenePresences.TryGetValue(agentID, out sp);
+ m_scenePresences.TryGetValue(agentID, out sp);
}
return sp;
@@ -1000,48 +1032,24 @@ namespace OpenSim.Region.Framework.Scenes
protected internal bool TryGetAvatar(UUID avatarId, out ScenePresence avatar)
{
- ScenePresence presence;
-
- lock (ScenePresences)
- {
- if (ScenePresences.TryGetValue(avatarId, out presence))
- {
- avatar = presence;
- return true;
-
- //if (!presence.IsChildAgent)
- //{
- // avatar = presence;
- // return true;
- //}
- //else
- //{
- // m_log.WarnFormat(
- // "[INNER SCENE]: Requested avatar {0} could not be found in scene {1} since it is only registered as a child agent!",
- // avatarId, m_parentScene.RegionInfo.RegionName);
- //}
- }
- }
-
- avatar = null;
- return false;
+ lock (m_scenePresences)
+ return m_scenePresences.TryGetValue(avatarId, out avatar);
}
protected internal bool TryGetAvatarByName(string avatarName, out ScenePresence avatar)
{
- lock (ScenePresences)
+ ScenePresence[] presences = GetScenePresences();
+
+ for (int i = 0; i < presences.Length; i++)
{
- foreach (ScenePresence presence in ScenePresences.Values)
+ ScenePresence presence = presences[i];
+
+ if (!presence.IsChildAgent)
{
- if (!presence.IsChildAgent)
+ if (String.Compare(avatarName, presence.ControllingClient.Name, true) == 0)
{
- string name = presence.ControllingClient.Name;
-
- if (String.Compare(avatarName, name, true) == 0)
- {
- avatar = presence;
- return true;
- }
+ avatar = presence;
+ return true;
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs
index 3097929..dfaa7ea 100644
--- a/OpenSim/Region/Framework/Scenes/SceneManager.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs
@@ -411,41 +411,46 @@ namespace OpenSim.Region.Framework.Scenes
///
public void SetDebugPacketLevelOnCurrentScene(int newDebug)
{
- ForEachCurrentScene(delegate(Scene scene)
- {
- List scenePresences = scene.GetScenePresences();
+ ForEachCurrentScene(
+ delegate(Scene scene)
+ {
+ ScenePresence[] scenePresences = scene.GetScenePresences();
+
+ for (int i = 0; i < scenePresences.Length; i++)
+ {
+ ScenePresence scenePresence = scenePresences[i];
- foreach (ScenePresence scenePresence in scenePresences)
- {
- if (!scenePresence.IsChildAgent)
- {
- m_log.ErrorFormat("Packet debug for {0} {1} set to {2}",
- scenePresence.Firstname,
- scenePresence.Lastname,
- newDebug);
+ if (!scenePresence.IsChildAgent)
+ {
+ m_log.ErrorFormat("Packet debug for {0} {1} set to {2}",
+ scenePresence.Firstname,
+ scenePresence.Lastname,
+ newDebug);
- scenePresence.ControllingClient.SetDebugPacketLevel(newDebug);
- }
- }
- });
+ scenePresence.ControllingClient.SetDebugPacketLevel(newDebug);
+ }
+ }
+ }
+ );
}
public List GetCurrentSceneAvatars()
{
List avatars = new List();
- ForEachCurrentScene(delegate(Scene scene)
- {
- List scenePresences = scene.GetScenePresences();
-
- foreach (ScenePresence scenePresence in scenePresences)
+ ForEachCurrentScene(
+ delegate(Scene scene)
{
- if (!scenePresence.IsChildAgent)
+ ScenePresence[] scenePresences = scene.GetScenePresences();
+
+ for (int i = 0; i < scenePresences.Length; i++)
{
- avatars.Add(scenePresence);
+ ScenePresence scenePresence = scenePresences[i];
+ if (!scenePresence.IsChildAgent)
+ avatars.Add(scenePresence);
}
}
- });
+ );
return avatars;
}
@@ -456,7 +461,7 @@ namespace OpenSim.Region.Framework.Scenes
ForEachCurrentScene(delegate(Scene scene)
{
- List scenePresences = scene.GetScenePresences();
+ ScenePresence[] scenePresences = scene.GetScenePresences();
presences.AddRange(scenePresences);
});
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 69b3ded..4f19761 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1182,8 +1182,8 @@ namespace OpenSim.Region.Framework.Scenes
{
// part.Inventory.RemoveScriptInstances();
- List avatars = Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
if (avatars[i].ParentID == LocalId)
{
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 32171a0..7193002 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1077,8 +1077,8 @@ if (m_shape != null) {
private void SendObjectPropertiesToClient(UUID AgentID)
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
// Ugly reference :(
if (avatars[i].UUID == AgentID)
@@ -1140,8 +1140,8 @@ if (m_shape != null) {
///
public void AddFullUpdateToAllAvatars()
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
avatars[i].SceneViewer.QueuePartForUpdate(this);
}
@@ -1165,8 +1165,8 @@ if (m_shape != null) {
/// Terse updates
public void AddTerseUpdateToAllAvatars()
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
avatars[i].SceneViewer.QueuePartForUpdate(this);
}
@@ -1894,24 +1894,24 @@ if (m_shape != null) {
}
else
{
- List avlist = m_parentGroup.Scene.GetScenePresences();
- if (avlist != null)
+ ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences();
+
+ for (int i = 0; i < avlist.Length; i++)
{
- foreach (ScenePresence av in avlist)
+ ScenePresence av = avlist[i];
+
+ if (av.LocalId == localId)
{
- if (av.LocalId == localId)
- {
- DetectedObject detobj = new DetectedObject();
- detobj.keyUUID = av.UUID;
- detobj.nameStr = av.ControllingClient.Name;
- detobj.ownerUUID = av.UUID;
- detobj.posVector = av.AbsolutePosition;
- detobj.rotQuat = av.Rotation;
- detobj.velVector = av.Velocity;
- detobj.colliderType = 0;
- detobj.groupUUID = av.ControllingClient.ActiveGroupId;
- colliding.Add(detobj);
- }
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = av.UUID;
+ detobj.nameStr = av.ControllingClient.Name;
+ detobj.ownerUUID = av.UUID;
+ detobj.posVector = av.AbsolutePosition;
+ detobj.rotQuat = av.Rotation;
+ detobj.velVector = av.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = av.ControllingClient.ActiveGroupId;
+ colliding.Add(detobj);
}
}
}
@@ -1965,26 +1965,25 @@ if (m_shape != null) {
}
else
{
- List avlist = m_parentGroup.Scene.GetScenePresences();
- if (avlist != null)
+ ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences();
+
+ for (int i = 0; i < avlist.Length; i++)
{
- foreach (ScenePresence av in avlist)
+ ScenePresence av = avlist[i];
+
+ if (av.LocalId == localId)
{
- if (av.LocalId == localId)
- {
- DetectedObject detobj = new DetectedObject();
- detobj.keyUUID = av.UUID;
- detobj.nameStr = av.Name;
- detobj.ownerUUID = av.UUID;
- detobj.posVector = av.AbsolutePosition;
- detobj.rotQuat = av.Rotation;
- detobj.velVector = av.Velocity;
- detobj.colliderType = 0;
- detobj.groupUUID = av.ControllingClient.ActiveGroupId;
- colliding.Add(detobj);
- }
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = av.UUID;
+ detobj.nameStr = av.Name;
+ detobj.ownerUUID = av.UUID;
+ detobj.posVector = av.AbsolutePosition;
+ detobj.rotQuat = av.Rotation;
+ detobj.velVector = av.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = av.ControllingClient.ActiveGroupId;
+ colliding.Add(detobj);
}
-
}
}
}
@@ -2035,24 +2034,24 @@ if (m_shape != null) {
}
else
{
- List avlist = m_parentGroup.Scene.GetScenePresences();
- if (avlist != null)
+ ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences();
+
+ for (int i = 0; i < avlist.Length; i++)
{
- foreach (ScenePresence av in avlist)
+ ScenePresence av = avlist[i];
+
+ if (av.LocalId == localId)
{
- if (av.LocalId == localId)
- {
- DetectedObject detobj = new DetectedObject();
- detobj.keyUUID = av.UUID;
- detobj.nameStr = av.Name;
- detobj.ownerUUID = av.UUID;
- detobj.posVector = av.AbsolutePosition;
- detobj.rotQuat = av.Rotation;
- detobj.velVector = av.Velocity;
- detobj.colliderType = 0;
- detobj.groupUUID = av.ControllingClient.ActiveGroupId;
- colliding.Add(detobj);
- }
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = av.UUID;
+ detobj.nameStr = av.Name;
+ detobj.ownerUUID = av.UUID;
+ detobj.posVector = av.AbsolutePosition;
+ detobj.rotQuat = av.Rotation;
+ detobj.velVector = av.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = av.ControllingClient.ActiveGroupId;
+ colliding.Add(detobj);
}
}
}
@@ -2312,8 +2311,8 @@ if (m_shape != null) {
///
public void SendFullUpdateToAllClients()
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
// Ugly reference :(
m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this,
@@ -2323,8 +2322,8 @@ if (m_shape != null) {
public void SendFullUpdateToAllClientsExcept(UUID agentID)
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
// Ugly reference :(
if (avatars[i].UUID != agentID)
@@ -2467,8 +2466,8 @@ if (m_shape != null) {
///
public void SendTerseUpdateToAllClients()
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
SendTerseUpdateToClient(avatars[i].ControllingClient);
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index ccfffe7..77706ac 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -869,14 +869,16 @@ namespace OpenSim.Region.Framework.Scenes
m_isChildAgent = false;
- List AnimAgents = m_scene.GetScenePresences();
- foreach (ScenePresence p in AnimAgents)
+ ScenePresence[] animAgents = m_scene.GetScenePresences();
+ for (int i = 0; i < animAgents.Length; i++)
{
- if (p != this)
- p.SendAnimPackToClient(ControllingClient);
+ ScenePresence presence = animAgents[i];
+
+ if (presence != this)
+ presence.SendAnimPackToClient(ControllingClient);
}
- m_scene.EventManager.TriggerOnMakeRootAgent(this);
+ m_scene.EventManager.TriggerOnMakeRootAgent(this);
}
///
@@ -2533,9 +2535,12 @@ namespace OpenSim.Region.Framework.Scenes
{
m_perfMonMS = Environment.TickCount;
- List avatars = m_scene.GetScenePresences();
- foreach (ScenePresence avatar in avatars)
+ ScenePresence[] avatars = m_scene.GetScenePresences();
+
+ for (int i = 0; i < avatars.Length; i++)
{
+ ScenePresence avatar = avatars[i];
+
// only send if this is the root (children are only "listening posts" in a foreign region)
if (!IsChildAgent)
{
@@ -2553,7 +2558,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- m_scene.StatsReporter.AddAgentUpdates(avatars.Count);
+ m_scene.StatsReporter.AddAgentUpdates(avatars.Length);
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
//SendAnimPack();
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 669189d..56d4d28 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -7227,13 +7227,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public LSL_Integer llGetNumberOfPrims()
{
m_host.AddScriptLPS(1);
- List presences = World.GetScenePresences();
- if (presences.Count == 0)
+ ScenePresence[] presences = World.GetScenePresences();
+ if (presences.Length == 0)
return 0;
int avatarCount = 0;
- foreach (ScenePresence presence in presences)
+ for (int i = 0; i < presences.Length; i++)
{
+ ScenePresence presence = presences[i];
+
if (!presence.IsChildAgent && presence.ParentID != 0)
{
if (m_host.ParentGroup.HasChildPrim(presence.ParentID))
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index a09c8db..ee01c3c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -404,7 +404,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
private List doAgentSensor(SenseRepeatClass ts)
{
- List Presences;
+ List presences;
List sensedEntities = new List();
// If this is an avatar sense by key try to get them directly
@@ -414,16 +414,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
ScenePresence p = m_CmdManager.m_ScriptEngine.World.GetScenePresence(ts.keyID);
if (p == null)
return sensedEntities;
- Presences = new List();
- Presences.Add(p);
+ presences = new List();
+ presences.Add(p);
}
else
{
- Presences = m_CmdManager.m_ScriptEngine.World.GetScenePresences();
+ presences = new List(m_CmdManager.m_ScriptEngine.World.GetScenePresences());
}
// If nobody about quit fast
- if (Presences.Count == 0)
+ if (presences.Count == 0)
return sensedEntities;
SceneObjectPart SensePoint = ts.host;
@@ -440,8 +440,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
Vector3 toRegionPos;
double dis;
- foreach (ScenePresence presence in Presences)
+ for (int i = 0; i < presences.Count; i++)
{
+ ScenePresence presence = presences[i];
bool keep = true;
if (presence.IsDeleted)
diff --git a/OpenSim/Region/UserStatistics/ActiveConnectionsAJAX.cs b/OpenSim/Region/UserStatistics/ActiveConnectionsAJAX.cs
index d7c39a3..704b74f 100644
--- a/OpenSim/Region/UserStatistics/ActiveConnectionsAJAX.cs
+++ b/OpenSim/Region/UserStatistics/ActiveConnectionsAJAX.cs
@@ -68,11 +68,11 @@ namespace OpenSim.Region.UserStatistics
HTMLUtil.OL_O(ref output, "");
foreach (Scene scene in all_scenes)
{
- List avatarInScene = scene.GetScenePresences();
+ ScenePresence[] avatarInScene = scene.GetScenePresences();
- HTMLUtil.LI_O(ref output, "");
+ HTMLUtil.LI_O(ref output, String.Empty);
output.Append(scene.RegionInfo.RegionName);
- HTMLUtil.OL_O(ref output, "");
+ HTMLUtil.OL_O(ref output, String.Empty);
foreach (ScenePresence av in avatarInScene)
{
Dictionary queues = new Dictionary();
@@ -81,7 +81,7 @@ namespace OpenSim.Region.UserStatistics
IStatsCollector isClient = (IStatsCollector) av.ControllingClient;
queues = decodeQueueReport(isClient.Report());
}
- HTMLUtil.LI_O(ref output, "");
+ HTMLUtil.LI_O(ref output, String.Empty);
output.Append(av.Name);
output.Append(" ");
output.Append((av.IsChildAgent ? "Child" : "Root"));
@@ -96,12 +96,12 @@ namespace OpenSim.Region.UserStatistics
(int) av.AbsolutePosition.Z));
}
Dictionary throttles = DecodeClientThrottles(av.ControllingClient.GetThrottlesPacked(1));
-
- HTMLUtil.UL_O(ref output, "");
+
+ HTMLUtil.UL_O(ref output, String.Empty);
foreach (string throttlename in throttles.Keys)
{
- HTMLUtil.LI_O(ref output, "");
+ HTMLUtil.LI_O(ref output, String.Empty);
output.Append(throttlename);
output.Append(":");
output.Append(throttles[throttlename].ToString());
--
cgit v1.1
From 53bf479bab05e689b1403a27a175bedad379ea6d Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Fri, 23 Oct 2009 01:11:40 -0700
Subject: Commented out noisy debugging about resent packets (normal) and
agents setting throttles (normal)
---
OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | 4 ++--
OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index a9bc7d2..460938e 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -304,8 +304,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
int total = resend + land + wind + cloud + task + texture + asset + state;
- m_log.DebugFormat("[LLUDPCLIENT]: {0} is setting throttles. Resend={1}, Land={2}, Wind={3}, Cloud={4}, Task={5}, Texture={6}, Asset={7}, State={8}, Total={9}",
- AgentID, resend, land, wind, cloud, task, texture, asset, state, total);
+ //m_log.DebugFormat("[LLUDPCLIENT]: {0} is setting throttles. Resend={1}, Land={2}, Wind={3}, Cloud={4}, Task={5}, Texture={6}, Asset={7}, State={8}, Total={9}",
+ // AgentID, resend, land, wind, cloud, task, texture, asset, state, total);
// Update the token buckets with new throttle values
TokenBucket bucket;
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 734471e..2973d4b 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -405,7 +405,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (expiredPackets != null)
{
- m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO);
+ //m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO);
// Resend packets
for (int i = 0; i < expiredPackets.Count; i++)
--
cgit v1.1
From ac0acb02962c37f870dc38a356e1530803f699e8 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Fri, 23 Oct 2009 01:33:05 -0700
Subject: * Changed the max RTO value to 60 seconds to comply with RFC 2988 *
Implemented section 5.5, exponential backoff of the RTO after a resend
---
OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | 2 +-
OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index 460938e..d2cd6d9 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -500,7 +500,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
RTO = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR));
// Clamp the retransmission timeout to manageable values
- RTO = Utils.Clamp(RTO, 3000, 10000);
+ RTO = Utils.Clamp(RTO, 3000, 60000);
//m_log.Debug("[LLUDPCLIENT]: Setting agent " + this.Agent.FullName + "'s RTO to " + RTO + "ms with an RTTVAR of " +
// RTTVAR + " based on new RTT of " + r + "ms");
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 2973d4b..7e929e5 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -407,6 +407,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
//m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO);
+ // Backoff the RTO
+ udpClient.RTO = Math.Min(udpClient.RTO * 2, 60000);
+
// Resend packets
for (int i = 0; i < expiredPackets.Count; i++)
{
--
cgit v1.1
From 37f7277378d38cdf2633e79d551cc0c83bf5e479 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Fri, 23 Oct 2009 01:33:43 -0700
Subject: Uncommented the resend log line so the previous commit can be seen in
action
---
OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 7e929e5..e9faf2e 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -405,7 +405,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (expiredPackets != null)
{
- //m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO);
+ m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO);
// Backoff the RTO
udpClient.RTO = Math.Min(udpClient.RTO * 2, 60000);
--
cgit v1.1
From d0019704e60da8392f505f1bb783ee668b0299b1 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 23 Oct 2009 09:47:45 +0100
Subject: Adding the presence service skeleton
---
OpenSim/Data/IPresenceData.cs | 55 ++++++++++++++
.../Services/PresenceService/PresenceService.cs | 53 ++++++++++++++
.../PresenceService/PresenceServiceBase.cs | 84 ++++++++++++++++++++++
prebuild.xml | 31 ++++++++
4 files changed, 223 insertions(+)
create mode 100644 OpenSim/Data/IPresenceData.cs
create mode 100644 OpenSim/Services/PresenceService/PresenceService.cs
create mode 100644 OpenSim/Services/PresenceService/PresenceServiceBase.cs
diff --git a/OpenSim/Data/IPresenceData.cs b/OpenSim/Data/IPresenceData.cs
new file mode 100644
index 0000000..ca661a2
--- /dev/null
+++ b/OpenSim/Data/IPresenceData.cs
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using OpenMetaverse;
+using OpenSim.Framework;
+
+namespace OpenSim.Data
+{
+ public class PresenceData
+ {
+ public UUID PrincipalID;
+ public UUID RegionID;
+ public Dictionary Data;
+ }
+
+ ///
+ /// An interface for connecting to the authentication datastore
+ ///
+ public interface IPresenceData
+ {
+ bool Store(PresenceData data);
+
+ PresenceData Get(UUID principalID);
+
+ bool SetDataItem(UUID principalID, string item, string value);
+
+ bool Delete(UUID regionID);
+ }
+}
diff --git a/OpenSim/Services/PresenceService/PresenceService.cs b/OpenSim/Services/PresenceService/PresenceService.cs
new file mode 100644
index 0000000..6e59642
--- /dev/null
+++ b/OpenSim/Services/PresenceService/PresenceService.cs
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Net;
+using System.Reflection;
+using Nini.Config;
+using log4net;
+using OpenSim.Framework;
+using OpenSim.Framework.Console;
+using OpenSim.Data;
+using OpenSim.Services.Interfaces;
+using OpenMetaverse;
+
+namespace OpenSim.Services.PresenceService
+{
+ public class PresenceService : PresenceServiceBase, IPresenceService
+ {
+ private static readonly ILog m_log =
+ LogManager.GetLogger(
+ MethodBase.GetCurrentMethod().DeclaringType);
+
+ public PresenceService(IConfigSource config)
+ : base(config)
+ {
+ }
+ }
+}
diff --git a/OpenSim/Services/PresenceService/PresenceServiceBase.cs b/OpenSim/Services/PresenceService/PresenceServiceBase.cs
new file mode 100644
index 0000000..60a246b
--- /dev/null
+++ b/OpenSim/Services/PresenceService/PresenceServiceBase.cs
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Reflection;
+using Nini.Config;
+using OpenSim.Framework;
+using OpenSim.Data;
+using OpenSim.Services.Interfaces;
+using OpenSim.Services.Base;
+
+namespace OpenSim.Services.PresenceService
+{
+ public class PresenceServiceBase : ServiceBase
+ {
+ protected IPresenceData m_Database = null;
+
+ public PresenceServiceBase(IConfigSource config)
+ : base(config)
+ {
+ string dllName = String.Empty;
+ string connString = String.Empty;
+ string realm = "agents";
+
+ //
+ // Try reading the [DatabaseService] section, if it exists
+ //
+ IConfig dbConfig = config.Configs["DatabaseService"];
+ if (dbConfig != null)
+ {
+ if (dllName == String.Empty)
+ dllName = dbConfig.GetString("StorageProvider", String.Empty);
+ if (connString == String.Empty)
+ connString = dbConfig.GetString("ConnectionString", String.Empty);
+ }
+
+ //
+ // [PresenceService] section overrides [DatabaseService], if it exists
+ //
+ IConfig presenceConfig = config.Configs["PresenceService"];
+ if (presenceConfig != null)
+ {
+ dllName = presenceConfig.GetString("StorageProvider", dllName);
+ connString = presenceConfig.GetString("ConnectionString", connString);
+ realm = presenceConfig.GetString("Realm", realm);
+ }
+
+ //
+ // We tried, but this doesn't exist. We can't proceed.
+ //
+ if (dllName.Equals(String.Empty))
+ throw new Exception("No StorageProvider configured");
+
+ m_Database = LoadPlugin(dllName, new Object[] { connString, realm });
+ if (m_Database == null)
+ throw new Exception("Could not find a storage interface in the given module");
+
+ }
+ }
+}
diff --git a/prebuild.xml b/prebuild.xml
index 1c44ebf..d2d1e6d 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -1411,6 +1411,37 @@
+
+
+
+ ../../../bin/
+
+
+
+
+ ../../../bin/
+
+
+
+ ../../../bin/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--
cgit v1.1
From 62f1a5e36d85b95e8f80bc073ba876873494963a Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Fri, 23 Oct 2009 02:38:59 -0700
Subject: Implemented a "FrontBack" prioritizer, using distance plus the plane
equation to give double weight to prims/avatars in front of you
---
OpenSim/Region/Framework/Scenes/Scene.cs | 4 ++
.../Region/Framework/Scenes/SceneObjectGroup.cs | 33 ++++++++++++++--
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 44 ++++++++++++++++++++++
bin/OpenSim.ini.example | 4 +-
4 files changed, 80 insertions(+), 5 deletions(-)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index d5e3445..ee848bb 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -61,6 +61,7 @@ namespace OpenSim.Region.Framework.Scenes
Time = 0,
Distance = 1,
SimpleAngularDistance = 2,
+ FrontBack = 3,
}
public delegate void SynchronizeSceneHandler(Scene scene);
@@ -540,6 +541,9 @@ namespace OpenSim.Region.Framework.Scenes
case "simpleangulardistance":
m_update_prioritization_scheme = UpdatePrioritizationSchemes.SimpleAngularDistance;
break;
+ case "frontback":
+ m_update_prioritization_scheme = UpdatePrioritizationSchemes.FrontBack;
+ break;
default:
m_log.Warn("[SCENE]: UpdatePrioritizationScheme was not recognized, setting to default settomg of Time");
m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 4f19761..dd8da20 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -493,8 +493,8 @@ namespace OpenSim.Region.Framework.Scenes
public Vector3 GroupScale()
{
- Vector3 minScale = new Vector3(Constants.RegionSize,Constants.RegionSize,Constants.RegionSize);
- Vector3 maxScale = new Vector3(0f,0f,0f);
+ Vector3 minScale = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionSize);
+ Vector3 maxScale = Vector3.Zero;
Vector3 finalScale = new Vector3(0.5f, 0.5f, 0.5f);
lock (m_parts)
@@ -577,7 +577,6 @@ namespace OpenSim.Region.Framework.Scenes
{
foreach (SceneObjectPart part in m_parts.Values)
{
-
Vector3 worldPos = part.GetWorldPosition();
Vector3 offset = worldPos - AbsolutePosition;
Quaternion worldRot;
@@ -3366,6 +3365,8 @@ namespace OpenSim.Region.Framework.Scenes
return GetPriorityByDistance(client);
case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance:
return GetPriorityBySimpleAngularDistance(client);
+ case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack:
+ return GetPriorityByFrontBack(client);
default:
throw new InvalidOperationException("UpdatePrioritizationScheme not defined");
}
@@ -3398,6 +3399,16 @@ namespace OpenSim.Region.Framework.Scenes
return double.NaN;
}
+ private double GetPriorityByFrontBack(IClientAPI client)
+ {
+ ScenePresence presence = Scene.GetScenePresence(client.AgentId);
+ if (presence != null)
+ {
+ return GetPriorityByFrontBack(presence.CameraPosition, presence.CameraAtAxis);
+ }
+ return double.NaN;
+ }
+
public double GetPriorityByDistance(Vector3 position)
{
return Vector3.Distance(AbsolutePosition, position);
@@ -3427,5 +3438,21 @@ namespace OpenSim.Region.Framework.Scenes
else
return double.MinValue;
}
+
+ public double GetPriorityByFrontBack(Vector3 camPosition, Vector3 camAtAxis)
+ {
+ // Distance
+ double priority = Vector3.Distance(camPosition, AbsolutePosition);
+
+ // Scale
+ //priority -= GroupScale().Length();
+
+ // Plane equation
+ float d = -Vector3.Dot(camPosition, camAtAxis);
+ float p = Vector3.Dot(camAtAxis, AbsolutePosition) + d;
+ if (p < 0.0f) priority *= 2.0f;
+
+ return priority;
+ }
}
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 77706ac..a610e42 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -297,6 +297,21 @@ namespace OpenSim.Region.Framework.Scenes
get { return Util.Axes2Rot(m_CameraAtAxis, m_CameraLeftAxis, m_CameraUpAxis); }
}
+ public Vector3 CameraAtAxis
+ {
+ get { return m_CameraAtAxis; }
+ }
+
+ public Vector3 CameraLeftAxis
+ {
+ get { return m_CameraLeftAxis; }
+ }
+
+ public Vector3 CameraUpAxis
+ {
+ get { return m_CameraUpAxis; }
+ }
+
public Vector3 Lookat
{
get
@@ -3867,6 +3882,8 @@ namespace OpenSim.Region.Framework.Scenes
return GetPriorityByDistance(client);
case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance:
return GetPriorityByDistance(client);
+ case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack:
+ return GetPriorityByFrontBack(client);
default:
throw new InvalidOperationException("UpdatePrioritizationScheme not defined.");
}
@@ -3888,11 +3905,34 @@ namespace OpenSim.Region.Framework.Scenes
return double.NaN;
}
+ private double GetPriorityByFrontBack(IClientAPI client)
+ {
+ ScenePresence presence = Scene.GetScenePresence(client.AgentId);
+ if (presence != null)
+ {
+ return GetPriorityByFrontBack(presence.CameraPosition, presence.CameraAtAxis);
+ }
+ return double.NaN;
+ }
+
private double GetPriorityByDistance(Vector3 position)
{
return Vector3.Distance(AbsolutePosition, position);
}
+ private double GetPriorityByFrontBack(Vector3 camPosition, Vector3 camAtAxis)
+ {
+ // Distance
+ double priority = Vector3.Distance(camPosition, AbsolutePosition);
+
+ // Plane equation
+ float d = -Vector3.Dot(camPosition, camAtAxis);
+ float p = Vector3.Dot(camAtAxis, AbsolutePosition) + d;
+ if (p < 0.0f) priority *= 2.0f;
+
+ return priority;
+ }
+
private double GetSOGUpdatePriority(SceneObjectGroup sog)
{
switch (Scene.UpdatePrioritizationScheme)
@@ -3903,6 +3943,8 @@ namespace OpenSim.Region.Framework.Scenes
return sog.GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition);
case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance:
return sog.GetPriorityBySimpleAngularDistance((IsChildAgent) ? AbsolutePosition : CameraPosition);
+ case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack:
+ return sog.GetPriorityByFrontBack(CameraPosition, CameraAtAxis);
default:
throw new InvalidOperationException("UpdatePrioritizationScheme not defined");
}
@@ -3929,6 +3971,8 @@ namespace OpenSim.Region.Framework.Scenes
case Scene.UpdatePrioritizationSchemes.Distance:
case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance:
return GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition);
+ case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack:
+ return GetPriorityByFrontBack(CameraPosition, CameraAtAxis);
default:
throw new InvalidOperationException("UpdatePrioritizationScheme not defined");
}
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 6ff70fc..3dc746e 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -1397,8 +1397,8 @@
[InterestManagement]
; This section controls how state updates are prioritized for each client
- ; Valid values are Time, Distance, and SimpleAngularDistance
- UpdatePrioritizationScheme = Distance;
+ ; Valid values are Time, Distance, SimpleAngularDistance, and FrontBack
+ UpdatePrioritizationScheme = FrontBack;
ReprioritizationEnabled = true;
ReprioritizationInterval = 2000.0;
RootReprioritizationDistance = 10.0;
--
cgit v1.1
From b0923e0d73da51718332a9741931442673c84fe0 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 23 Oct 2009 10:41:05 +0100
Subject: Fix a glitch in a ROBUST message
---
OpenSim/Server/ServerMain.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/OpenSim/Server/ServerMain.cs b/OpenSim/Server/ServerMain.cs
index a7b33c9..10cd9c5 100644
--- a/OpenSim/Server/ServerMain.cs
+++ b/OpenSim/Server/ServerMain.cs
@@ -96,7 +96,7 @@ namespace OpenSim.Server
if (port != 0)
server = m_Server.GetHttpServer(port);
- if (port != m_Server.DefaultPort)
+ if (port != m_Server.DefaultPort && port != 0)
m_log.InfoFormat("[SERVER]: Loading {0} on port {1}", friendlyName, port);
else
m_log.InfoFormat("[SERVER]: Loading {0}", friendlyName);
--
cgit v1.1
From 71c929137f48a0a7d97dbc866cbe2b12319aa40b Mon Sep 17 00:00:00 2001
From: unknown
Date: Fri, 23 Oct 2009 03:52:49 -0700
Subject: Inconsistent locking of SenseRepeaters in Script Engine.
When I attempt to 'save oar' on a region with thousands of scripts with timers, I get a NullReferenceException every time. The problem comes from inconsistent locking in SensorRepeat.cs of the SenseRepeaters List. It is iterated and modified in many places and these places are all wrapped in a lock except in the GetSerializationData(). This is the function throwing the exception because an item in the list becomes null during iteration.
The attached patch locks SenseRepeatListLock in GetSerializationData()
---
.../Shared/Api/Implementation/Plugins/SensorRepeat.cs | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index ee01c3c..b75a2e4 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -516,16 +516,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
{
List
- public override PhysicsVector Position
+ public override Vector3 Position
{
get { return _position; }
set
{
if (Body == IntPtr.Zero || Shell == IntPtr.Zero)
{
- if (PhysicsVector.isFinite(value))
+ if (value.IsFinite())
{
- if (value.Z > 9999999)
+ if (value.Z > 9999999f)
{
value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5;
}
- if (value.Z < -90000)
+ if (value.Z < -90000f)
{
value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5;
}
@@ -447,7 +438,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
- public override PhysicsVector RotationalVelocity
+ public override Vector3 RotationalVelocity
{
get { return m_rotationalVelocity; }
set { m_rotationalVelocity = value; }
@@ -457,20 +448,20 @@ namespace OpenSim.Region.Physics.OdePlugin
/// This property sets the height of the avatar only. We use the height to make sure the avatar stands up straight
/// and use it to offset landings properly
///
- public override PhysicsVector Size
+ public override Vector3 Size
{
- get { return new PhysicsVector(CAPSULE_RADIUS*2, CAPSULE_RADIUS*2, CAPSULE_LENGTH); }
+ get { return new Vector3(CAPSULE_RADIUS * 2, CAPSULE_RADIUS * 2, CAPSULE_LENGTH); }
set
{
- if (PhysicsVector.isFinite(value))
+ if (value.IsFinite())
{
m_pidControllerActive = true;
- PhysicsVector SetSize = value;
+ Vector3 SetSize = value;
m_tainted_CAPSULE_LENGTH = (SetSize.Z*1.15f) - CAPSULE_RADIUS*2.0f;
//m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
- Velocity = new PhysicsVector(0f, 0f, 0f);
+ Velocity = Vector3.Zero;
_parent_scene.AddPhysicsActorTaint(this);
}
@@ -481,7 +472,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
- private void AlignAvatarTiltWithCurrentDirectionOfMovement(PhysicsVector movementVector)
+ private void AlignAvatarTiltWithCurrentDirectionOfMovement(Vector3 movementVector)
{
movementVector.Z = 0f;
float magnitude = (float)Math.Sqrt((double)(movementVector.X * movementVector.X + movementVector.Y * movementVector.Y));
@@ -643,7 +634,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// (with -0..0 motor stops) falls into the terrain for reasons yet
// to be comprehended in their entirety.
#endregion
- AlignAvatarTiltWithCurrentDirectionOfMovement(new PhysicsVector(0,0,0));
+ AlignAvatarTiltWithCurrentDirectionOfMovement(Vector3.Zero);
d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, 0.08f);
d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0f);
d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, 0.08f);
@@ -688,7 +679,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
- public override void LockAngularMotion(PhysicsVector axis)
+ public override void LockAngularMotion(Vector3 axis)
{
}
@@ -716,9 +707,9 @@ namespace OpenSim.Region.Physics.OdePlugin
// //m_log.Info("[PHYSICSAV]: Rotation: " + bodyrotation.M00 + " : " + bodyrotation.M01 + " : " + bodyrotation.M02 + " : " + bodyrotation.M10 + " : " + bodyrotation.M11 + " : " + bodyrotation.M12 + " : " + bodyrotation.M20 + " : " + bodyrotation.M21 + " : " + bodyrotation.M22);
// }
- public override PhysicsVector Force
+ public override Vector3 Force
{
- get { return new PhysicsVector(_target_velocity.X, _target_velocity.Y, _target_velocity.Z); }
+ get { return _target_velocity; }
set { return; }
}
@@ -733,7 +724,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
- public override void VehicleVectorParam(int param, PhysicsVector value)
+ public override void VehicleVectorParam(int param, Vector3 value)
{
}
@@ -748,14 +739,14 @@ namespace OpenSim.Region.Physics.OdePlugin
}
- public override PhysicsVector CenterOfMass
+ public override Vector3 CenterOfMass
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
- public override PhysicsVector GeometricCenter
+ public override Vector3 GeometricCenter
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
public override PrimitiveBaseShape Shape
@@ -763,18 +754,18 @@ namespace OpenSim.Region.Physics.OdePlugin
set { return; }
}
- public override PhysicsVector Velocity
+ public override Vector3 Velocity
{
get {
- // There's a problem with PhysicsVector.Zero! Don't Use it Here!
+ // There's a problem with Vector3.Zero! Don't Use it Here!
if (_zeroFlag)
- return new PhysicsVector(0f, 0f, 0f);
+ return Vector3.Zero;
m_lastUpdateSent = false;
return _velocity;
}
set
{
- if (PhysicsVector.isFinite(value))
+ if (value.IsFinite())
{
m_pidControllerActive = true;
_target_velocity = value;
@@ -786,9 +777,9 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
- public override PhysicsVector Torque
+ public override Vector3 Torque
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
set { return; }
}
@@ -814,12 +805,12 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
- public override PhysicsVector Acceleration
+ public override Vector3 Acceleration
{
get { return _acceleration; }
}
- public void SetAcceleration(PhysicsVector accel)
+ public void SetAcceleration(Vector3 accel)
{
m_pidControllerActive = true;
_acceleration = accel;
@@ -830,9 +821,9 @@ namespace OpenSim.Region.Physics.OdePlugin
/// The PID controller takes this target velocity and tries to make it a reality
///
///
- public override void AddForce(PhysicsVector force, bool pushforce)
+ public override void AddForce(Vector3 force, bool pushforce)
{
- if (PhysicsVector.isFinite(force))
+ if (force.IsFinite())
{
if (pushforce)
{
@@ -861,7 +852,7 @@ namespace OpenSim.Region.Physics.OdePlugin
//m_lastUpdateSent = false;
}
- public override void AddAngularForce(PhysicsVector force, bool pushforce)
+ public override void AddAngularForce(Vector3 force, bool pushforce)
{
}
@@ -870,7 +861,7 @@ namespace OpenSim.Region.Physics.OdePlugin
/// After all of the forces add up with 'add force' we apply them with doForce
///
///
- public void doForce(PhysicsVector force)
+ public void doForce(Vector3 force)
{
if (!collidelock)
{
@@ -881,7 +872,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
- public override void SetMomentum(PhysicsVector momentum)
+ public override void SetMomentum(Vector3 momentum)
{
}
@@ -908,9 +899,9 @@ namespace OpenSim.Region.Physics.OdePlugin
//PidStatus = true;
d.Vector3 localpos = d.BodyGetPosition(Body);
- PhysicsVector localPos = new PhysicsVector(localpos.X, localpos.Y, localpos.Z);
+ Vector3 localPos = new Vector3(localpos.X, localpos.Y, localpos.Z);
- if (!PhysicsVector.isFinite(localPos))
+ if (!localPos.IsFinite())
{
m_log.Warn("[PHYSICS]: Avatar Position is non-finite!");
@@ -946,7 +937,7 @@ namespace OpenSim.Region.Physics.OdePlugin
return;
}
- PhysicsVector vec = new PhysicsVector();
+ Vector3 vec = Vector3.Zero;
d.Vector3 vel = d.BodyGetLinearVel(Body);
float movementdivisor = 1f;
@@ -1059,12 +1050,12 @@ namespace OpenSim.Region.Physics.OdePlugin
}
// end add Kitto Flora
}
- if (PhysicsVector.isFinite(vec))
+ if (vec.IsFinite())
{
doForce(vec);
if (!_zeroFlag)
{
- AlignAvatarTiltWithCurrentDirectionOfMovement(new PhysicsVector(vec.X, vec.Y, vec.Z));
+ AlignAvatarTiltWithCurrentDirectionOfMovement(vec);
}
}
else
@@ -1197,7 +1188,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{
}
- public override PhysicsVector PIDTarget { set { return; } }
+ public override Vector3 PIDTarget { set { return; } }
public override bool PIDActive { set { return; } }
public override float PIDTau { set { return; } }
@@ -1311,7 +1302,7 @@ namespace OpenSim.Region.Physics.OdePlugin
d.GeomDestroy(Shell);
AvatarGeomAndBodyCreation(_position.X, _position.Y,
_position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor);
- Velocity = new PhysicsVector(0f, 0f, 0f);
+ Velocity = Vector3.Zero;
_parent_scene.geom_name_map[Shell] = m_name;
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
@@ -1325,7 +1316,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
- if (!m_taintPosition.IsIdentical(_position, 0.05f))
+ if (!m_taintPosition.ApproxEquals(_position, 0.05f))
{
if (Body != IntPtr.Zero)
{
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
index 019c78b..4a802cd 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs
@@ -232,7 +232,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}//end ProcessFloatVehicleParam
- internal void ProcessVectorVehicleParam(Vehicle pParam, PhysicsVector pValue)
+ internal void ProcessVectorVehicleParam(Vehicle pParam, Vector3 pValue)
{
switch (pParam)
{
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 09c8582..5ff9d32 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -57,44 +57,43 @@ namespace OpenSim.Region.Physics.OdePlugin
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- private PhysicsVector _position;
- private PhysicsVector _velocity;
- private PhysicsVector _torque = new PhysicsVector(0,0,0);
- private PhysicsVector m_lastVelocity = new PhysicsVector(0.0f, 0.0f, 0.0f);
- private PhysicsVector m_lastposition = new PhysicsVector(0.0f, 0.0f, 0.0f);
+ private Vector3 _position;
+ private Vector3 _velocity;
+ private Vector3 _torque;
+ private Vector3 m_lastVelocity;
+ private Vector3 m_lastposition;
private Quaternion m_lastorientation = new Quaternion();
- private PhysicsVector m_rotationalVelocity;
- private PhysicsVector _size;
- private PhysicsVector _acceleration;
+ private Vector3 m_rotationalVelocity;
+ private Vector3 _size;
+ private Vector3 _acceleration;
// private d.Vector3 _zeroPosition = new d.Vector3(0.0f, 0.0f, 0.0f);
private Quaternion _orientation;
- private PhysicsVector m_taintposition;
- private PhysicsVector m_taintsize;
- private PhysicsVector m_taintVelocity = new PhysicsVector(0, 0, 0);
- private PhysicsVector m_taintTorque = new PhysicsVector(0, 0, 0);
+ private Vector3 m_taintposition;
+ private Vector3 m_taintsize;
+ private Vector3 m_taintVelocity;
+ private Vector3 m_taintTorque;
private Quaternion m_taintrot;
- private PhysicsVector m_angularlock = new PhysicsVector(1f, 1f, 1f);
- private PhysicsVector m_taintAngularLock = new PhysicsVector(1f, 1f, 1f);
+ private Vector3 m_angularlock = Vector3.One;
+ private Vector3 m_taintAngularLock = Vector3.One;
private IntPtr Amotor = IntPtr.Zero;
- private PhysicsVector m_PIDTarget = new PhysicsVector(0, 0, 0);
- // private PhysicsVector m_taintPIDTarget = new PhysicsVector(0, 0, 0);
- private float m_PIDTau = 0f;
+ private Vector3 m_PIDTarget;
+ private float m_PIDTau;
private float PID_D = 35f;
private float PID_G = 25f;
- private bool m_usePID = false;
+ private bool m_usePID;
// KF: These next 7 params apply to llSetHoverHeight(float height, integer water, float tau),
// and are for non-VEHICLES only.
-
- private float m_PIDHoverHeight = 0f;
- private float m_PIDHoverTau = 0f;
- private bool m_useHoverPID = false;
+
+ private float m_PIDHoverHeight;
+ private float m_PIDHoverTau;
+ private bool m_useHoverPID;
private PIDHoverType m_PIDHoverType = PIDHoverType.Ground;
- private float m_targetHoverHeight = 0f;
- private float m_groundHeight = 0f;
- private float m_waterHeight = 0f;
- private float m_buoyancy = 0f; //KF: m_buoyancy should be set by llSetBuoyancy() for non-vehicle.
+ private float m_targetHoverHeight;
+ private float m_groundHeight;
+ private float m_waterHeight;
+ private float m_buoyancy; //KF: m_buoyancy should be set by llSetBuoyancy() for non-vehicle.
// private float m_tensor = 5f;
private int body_autodisable_frames = 20;
@@ -105,11 +104,11 @@ namespace OpenSim.Region.Physics.OdePlugin
| CollisionCategories.Body
| CollisionCategories.Character
);
- private bool m_taintshape = false;
- private bool m_taintPhysics = false;
+ private bool m_taintshape;
+ private bool m_taintPhysics;
private bool m_collidesLand = true;
- private bool m_collidesWater = false;
- public bool m_returnCollisions = false;
+ private bool m_collidesWater;
+ public bool m_returnCollisions;
// Default we're a Geometry
private CollisionCategories m_collisionCategories = (CollisionCategories.Geom);
@@ -117,85 +116,83 @@ namespace OpenSim.Region.Physics.OdePlugin
// Default, Collide with Other Geometries, spaces and Bodies
private CollisionCategories m_collisionFlags = m_default_collisionFlags;
- public bool m_taintremove = false;
- public bool m_taintdisable = false;
- public bool m_disabled = false;
- public bool m_taintadd = false;
- public bool m_taintselected = false;
- public bool m_taintCollidesWater = false;
+ public bool m_taintremove;
+ public bool m_taintdisable;
+ public bool m_disabled;
+ public bool m_taintadd;
+ public bool m_taintselected;
+ public bool m_taintCollidesWater;
- public uint m_localID = 0;
+ public uint m_localID;
//public GCHandle gc;
private CollisionLocker ode;
private bool m_taintforce = false;
private bool m_taintaddangularforce = false;
- private PhysicsVector m_force = new PhysicsVector(0.0f, 0.0f, 0.0f);
- private List m_forcelist = new List();
- private List m_angularforcelist = new List();
+ private Vector3 m_force;
+ private List m_forcelist = new List();
+ private List m_angularforcelist = new List();
private IMesh _mesh;
private PrimitiveBaseShape _pbs;
private OdeScene _parent_scene;
- public IntPtr m_targetSpace = (IntPtr) 0;
+ public IntPtr m_targetSpace = IntPtr.Zero;
public IntPtr prim_geom;
public IntPtr prev_geom;
public IntPtr _triMeshData;
- private IntPtr _linkJointGroup = (IntPtr)0;
- private PhysicsActor _parent = null;
- private PhysicsActor m_taintparent = null;
+ private IntPtr _linkJointGroup = IntPtr.Zero;
+ private PhysicsActor _parent;
+ private PhysicsActor m_taintparent;
private List childrenPrim = new List();
- private bool iscolliding = false;
- private bool m_isphysical = false;
- private bool m_isSelected = false;
+ private bool iscolliding;
+ private bool m_isphysical;
+ private bool m_isSelected;
- internal bool m_isVolumeDetect = false; // If true, this prim only detects collisions but doesn't collide actively
+ internal bool m_isVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively
- private bool m_throttleUpdates = false;
- private int throttleCounter = 0;
- public int m_interpenetrationcount = 0;
- public float m_collisionscore = 0;
- public int m_roundsUnderMotionThreshold = 0;
- private int m_crossingfailures = 0;
+ private bool m_throttleUpdates;
+ private int throttleCounter;
+ public int m_interpenetrationcount;
+ public float m_collisionscore;
+ public int m_roundsUnderMotionThreshold;
+ private int m_crossingfailures;
- public bool outofBounds = false;
+ public bool outofBounds;
private float m_density = 10.000006836f; // Aluminum g/cm3;
- public bool _zeroFlag = false;
- private bool m_lastUpdateSent = false;
+ public bool _zeroFlag;
+ private bool m_lastUpdateSent;
- public IntPtr Body = (IntPtr) 0;
+ public IntPtr Body = IntPtr.Zero;
public String m_primName;
-// private String m_primName;
- private PhysicsVector _target_velocity;
+ private Vector3 _target_velocity;
public d.Mass pMass;
- public int m_eventsubscription = 0;
- private CollisionEventUpdate CollisionEventsThisFrame = null;
+ public int m_eventsubscription;
+ private CollisionEventUpdate CollisionEventsThisFrame;
- private IntPtr m_linkJoint = (IntPtr)0;
+ private IntPtr m_linkJoint = IntPtr.Zero;
- public volatile bool childPrim = false;
+ public volatile bool childPrim;
private ODEDynamics m_vehicle;
internal int m_material = (int)Material.Wood;
- public OdePrim(String primName, OdeScene parent_scene, PhysicsVector pos, PhysicsVector size,
+ public OdePrim(String primName, OdeScene parent_scene, Vector3 pos, Vector3 size,
Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode)
{
- _target_velocity = new PhysicsVector(0, 0, 0);
m_vehicle = new ODEDynamics();
//gc = GCHandle.Alloc(prim_geom, GCHandleType.Pinned);
ode = dode;
- _velocity = new PhysicsVector();
- if (!PhysicsVector.isFinite(pos))
+ if (!pos.IsFinite())
{
- pos = new PhysicsVector(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), parent_scene.GetTerrainHeightAtXY(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f)) + 0.5f);
+ pos = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f),
+ parent_scene.GetTerrainHeightAtXY(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f)) + 0.5f);
m_log.Warn("[PHYSICS]: Got nonFinite Object create Position");
}
_position = pos;
@@ -210,9 +207,9 @@ namespace OpenSim.Region.Physics.OdePlugin
prim_geom = IntPtr.Zero;
prev_geom = IntPtr.Zero;
- if (!PhysicsVector.isFinite(pos))
+ if (!pos.IsFinite())
{
- size = new PhysicsVector(0.5f, 0.5f, 0.5f);
+ size = new Vector3(0.5f, 0.5f, 0.5f);
m_log.Warn("[PHYSICS]: Got nonFinite Object create Size");
}
@@ -222,8 +219,6 @@ namespace OpenSim.Region.Physics.OdePlugin
_size = size;
m_taintsize = _size;
- _acceleration = new PhysicsVector();
- m_rotationalVelocity = PhysicsVector.Zero;
if (!QuaternionIsFinite(rotation))
{
@@ -388,7 +383,7 @@ namespace OpenSim.Region.Physics.OdePlugin
m_disabled = false;
// The body doesn't already have a finite rotation mode set here
- if ((!m_angularlock.IsIdentical(PhysicsVector.Zero, 0)) && _parent == null)
+ if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0.0f)) && _parent == null)
{
createAMotor(m_angularlock);
}
@@ -882,7 +877,7 @@ namespace OpenSim.Region.Physics.OdePlugin
if (prim_geom != IntPtr.Zero)
{
- if (!_position.IsIdentical(m_taintposition,0f))
+ if (!_position.ApproxEquals(m_taintposition, 0f))
changemove(timestep);
if (m_taintrot != _orientation)
@@ -907,7 +902,7 @@ namespace OpenSim.Region.Physics.OdePlugin
changePhysicsStatus(timestep);
//
- if (!_size.IsIdentical(m_taintsize,0))
+ if (!_size.ApproxEquals(m_taintsize,0f))
changesize(timestep);
//
@@ -921,7 +916,7 @@ namespace OpenSim.Region.Physics.OdePlugin
if (m_taintaddangularforce)
changeAddAngularForce(timestep);
- if (!m_taintTorque.IsIdentical(PhysicsVector.Zero, 0.001f))
+ if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f))
changeSetTorque(timestep);
if (m_taintdisable)
@@ -930,7 +925,7 @@ namespace OpenSim.Region.Physics.OdePlugin
if (m_taintselected != m_isSelected)
changeSelectedStatus(timestep);
- if (!m_taintVelocity.IsIdentical(PhysicsVector.Zero, 0.001f))
+ if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f))
changevelocity(timestep);
if (m_taintparent != _parent)
@@ -939,7 +934,7 @@ namespace OpenSim.Region.Physics.OdePlugin
if (m_taintCollidesWater != m_collidesWater)
changefloatonwater(timestep);
- if (!m_angularlock.IsIdentical(m_taintAngularLock,0))
+ if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f))
changeAngularLock(timestep);
}
@@ -959,7 +954,7 @@ namespace OpenSim.Region.Physics.OdePlugin
//If we have a parent then we're not authorative here
if (_parent == null)
{
- if (!m_taintAngularLock.IsIdentical(new PhysicsVector(1f,1f,1f), 0))
+ if (!m_taintAngularLock.ApproxEquals(Vector3.One, 0f))
{
//d.BodySetFiniteRotationMode(Body, 0);
//d.BodySetFiniteRotationAxis(Body,m_taintAngularLock.X,m_taintAngularLock.Y,m_taintAngularLock.Z);
@@ -976,7 +971,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
// Store this for later in case we get turned into a separate body
- m_angularlock = new PhysicsVector(m_taintAngularLock.X, m_taintAngularLock.Y, m_taintAngularLock.Z);
+ m_angularlock = m_taintAngularLock;
}
@@ -1120,7 +1115,7 @@ namespace OpenSim.Region.Physics.OdePlugin
prm.m_disabled = false;
// The body doesn't already have a finite rotation mode set here
- if ((!m_angularlock.IsIdentical(PhysicsVector.Zero, 0)) && _parent == null)
+ if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null)
{
prm.createAMotor(m_angularlock);
}
@@ -1163,7 +1158,7 @@ namespace OpenSim.Region.Physics.OdePlugin
m_disabled = false;
// The body doesn't already have a finite rotation mode set here
- if ((!m_angularlock.IsIdentical(PhysicsVector.Zero, 0)) && _parent == null)
+ if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null)
{
createAMotor(m_angularlock);
}
@@ -1347,7 +1342,7 @@ namespace OpenSim.Region.Physics.OdePlugin
m_taintshape = false;
m_taintforce = false;
m_taintdisable = false;
- m_taintVelocity = PhysicsVector.Zero;
+ m_taintVelocity = Vector3.Zero;
}
public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh)
@@ -1576,7 +1571,7 @@ Console.WriteLine(" JointCreateFixed");
//Console.WriteLine("Move " + m_primName);
if(!d.BodyIsEnabled (Body)) d.BodyEnable (Body); // KF add 161009
// NON-'VEHICLES' are dealt with here
- if (d.BodyIsEnabled(Body) && !m_angularlock.IsIdentical(PhysicsVector.Zero, 0.003f))
+ if (d.BodyIsEnabled(Body) && !m_angularlock.ApproxEquals(Vector3.Zero, 0.003f))
{
d.Vector3 avel2 = d.BodyGetAngularVel(Body);
if (m_angularlock.X == 1)
@@ -1633,7 +1628,7 @@ Console.WriteLine(" JointCreateFixed");
d.Vector3 pos = d.BodyGetPosition(Body);
_target_velocity =
- new PhysicsVector(
+ new Vector3(
(m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep),
(m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep),
(m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep)
@@ -1641,7 +1636,7 @@ Console.WriteLine(" JointCreateFixed");
// if velocity is zero, use position control; otherwise, velocity control
- if (_target_velocity.IsIdentical(PhysicsVector.Zero,0.1f))
+ if (_target_velocity.ApproxEquals(Vector3.Zero,0.1f))
{
// keep track of where we stopped. No more slippin' & slidin'
@@ -1726,13 +1721,13 @@ Console.WriteLine(" JointCreateFixed");
_target_velocity =
- new PhysicsVector(0.0f, 0.0f,
+ new Vector3(0.0f, 0.0f,
(m_targetHoverHeight - pos.Z) * ((PID_G - m_PIDHoverTau) * timestep)
);
// if velocity is zero, use position control; otherwise, velocity control
- if (_target_velocity.IsIdentical(PhysicsVector.Zero, 0.1f))
+ if (_target_velocity.ApproxEquals(Vector3.Zero, 0.1f))
{
// keep track of where we stopped. No more slippin' & slidin'
@@ -1821,7 +1816,7 @@ Console.WriteLine(" JointCreateFixed");
d.BodySetQuaternion(Body, ref myrot);
if (m_isphysical)
{
- if (!m_angularlock.IsIdentical(new PhysicsVector(1, 1, 1), 0))
+ if (!m_angularlock.ApproxEquals(Vector3.One, 0f))
createAMotor(m_angularlock);
}
}
@@ -2130,7 +2125,7 @@ Console.WriteLine(" JointCreateFixed");
//m_log.Info("[PHYSICS]: dequeing forcelist");
if (IsPhysical)
{
- PhysicsVector iforce = new PhysicsVector();
+ Vector3 iforce = Vector3.Zero;
for (int i = 0; i < m_forcelist.Count; i++)
{
iforce = iforce + (m_forcelist[i] * 100);
@@ -2160,8 +2155,8 @@ Console.WriteLine(" JointCreateFixed");
d.BodySetTorque(Body, m_taintTorque.X, m_taintTorque.Y, m_taintTorque.Z);
}
}
-
- m_taintTorque = new PhysicsVector(0, 0, 0);
+
+ m_taintTorque = Vector3.Zero;
}
public void changeAddAngularForce(float timestamp)
@@ -2173,7 +2168,7 @@ Console.WriteLine(" JointCreateFixed");
//m_log.Info("[PHYSICS]: dequeing forcelist");
if (IsPhysical)
{
- PhysicsVector iforce = new PhysicsVector();
+ Vector3 iforce = Vector3.Zero;
for (int i = 0; i < m_angularforcelist.Count; i++)
{
iforce = iforce + (m_angularforcelist[i] * 100);
@@ -2207,7 +2202,7 @@ Console.WriteLine(" JointCreateFixed");
//resetCollisionAccounting();
}
- m_taintVelocity = PhysicsVector.Zero;
+ m_taintVelocity = Vector3.Zero;
}
public override bool IsPhysical
@@ -2216,7 +2211,7 @@ Console.WriteLine(" JointCreateFixed");
set {
m_isphysical = value;
if (!m_isphysical) // Zero the remembered last velocity
- m_lastVelocity = new PhysicsVector(0.0f, 0.0f, 0.0f);
+ m_lastVelocity = Vector3.Zero;
}
}
@@ -2261,7 +2256,7 @@ Console.WriteLine(" JointCreateFixed");
get { return _zeroFlag; }
}
- public override PhysicsVector Position
+ public override Vector3 Position
{
get { return _position; }
@@ -2270,12 +2265,12 @@ Console.WriteLine(" JointCreateFixed");
}
}
- public override PhysicsVector Size
+ public override Vector3 Size
{
get { return _size; }
set
{
- if (PhysicsVector.isFinite(value))
+ if (value.IsFinite())
{
_size = value;
}
@@ -2291,13 +2286,13 @@ Console.WriteLine(" JointCreateFixed");
get { return CalculateMass(); }
}
- public override PhysicsVector Force
+ public override Vector3 Force
{
- //get { return PhysicsVector.Zero; }
+ //get { return Vector3.Zero; }
get { return m_force; }
set
{
- if (PhysicsVector.isFinite(value))
+ if (value.IsFinite())
{
m_force = value;
}
@@ -2319,7 +2314,7 @@ Console.WriteLine(" JointCreateFixed");
m_vehicle.ProcessFloatVehicleParam((Vehicle) param, value);
}
- public override void VehicleVectorParam(int param, PhysicsVector value)
+ public override void VehicleVectorParam(int param, Vector3 value)
{
m_vehicle.ProcessVectorVehicleParam((Vehicle) param, value);
}
@@ -2337,14 +2332,14 @@ Console.WriteLine(" JointCreateFixed");
}
}
- public override PhysicsVector CenterOfMass
+ public override Vector3 CenterOfMass
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
- public override PhysicsVector GeometricCenter
+ public override Vector3 GeometricCenter
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
public override PrimitiveBaseShape Shape
@@ -2356,13 +2351,13 @@ Console.WriteLine(" JointCreateFixed");
}
}
- public override PhysicsVector Velocity
+ public override Vector3 Velocity
{
get
{
// Averate previous velocity with the new one so
// client object interpolation works a 'little' better
- PhysicsVector returnVelocity = new PhysicsVector();
+ Vector3 returnVelocity = Vector3.Zero;
returnVelocity.X = (m_lastVelocity.X + _velocity.X)/2;
returnVelocity.Y = (m_lastVelocity.Y + _velocity.Y)/2;
returnVelocity.Z = (m_lastVelocity.Z + _velocity.Z)/2;
@@ -2370,7 +2365,7 @@ Console.WriteLine(" JointCreateFixed");
}
set
{
- if (PhysicsVector.isFinite(value))
+ if (value.IsFinite())
{
_velocity = value;
@@ -2385,19 +2380,19 @@ Console.WriteLine(" JointCreateFixed");
}
}
- public override PhysicsVector Torque
+ public override Vector3 Torque
{
get
{
if (!m_isphysical || Body == IntPtr.Zero)
- return new PhysicsVector(0,0,0);
+ return Vector3.Zero;
return _torque;
}
set
{
- if (PhysicsVector.isFinite(value))
+ if (value.IsFinite())
{
m_taintTorque = value;
_parent_scene.AddPhysicsActorTaint(this);
@@ -2449,20 +2444,20 @@ Console.WriteLine(" JointCreateFixed");
return true;
}
- public override PhysicsVector Acceleration
+ public override Vector3 Acceleration
{
get { return _acceleration; }
}
- public void SetAcceleration(PhysicsVector accel)
+ public void SetAcceleration(Vector3 accel)
{
_acceleration = accel;
}
- public override void AddForce(PhysicsVector force, bool pushforce)
+ public override void AddForce(Vector3 force, bool pushforce)
{
- if (PhysicsVector.isFinite(force))
+ if (force.IsFinite())
{
m_forcelist.Add(force);
m_taintforce = true;
@@ -2474,9 +2469,9 @@ Console.WriteLine(" JointCreateFixed");
//m_log.Info("[PHYSICS]: Added Force:" + force.ToString() + " to prim at " + Position.ToString());
}
- public override void AddAngularForce(PhysicsVector force, bool pushforce)
+ public override void AddAngularForce(Vector3 force, bool pushforce)
{
- if (PhysicsVector.isFinite(force))
+ if (force.IsFinite())
{
m_angularforcelist.Add(force);
m_taintaddangularforce = true;
@@ -2487,23 +2482,23 @@ Console.WriteLine(" JointCreateFixed");
}
}
- public override PhysicsVector RotationalVelocity
+ public override Vector3 RotationalVelocity
{
get
{
- PhysicsVector pv = new PhysicsVector(0, 0, 0);
+ Vector3 pv = Vector3.Zero;
if (_zeroFlag)
return pv;
m_lastUpdateSent = false;
- if (m_rotationalVelocity.IsIdentical(pv, 0.2f))
+ if (m_rotationalVelocity.ApproxEquals(pv, 0.2f))
return pv;
return m_rotationalVelocity;
}
set
{
- if (PhysicsVector.isFinite(value))
+ if (value.IsFinite())
{
m_rotationalVelocity = value;
}
@@ -2544,16 +2539,16 @@ Console.WriteLine(" JointCreateFixed");
m_taintparent = null;
}
- public override void LockAngularMotion(PhysicsVector axis)
+ public override void LockAngularMotion(Vector3 axis)
{
// reverse the zero/non zero values for ODE.
- if (PhysicsVector.isFinite(axis))
+ if (axis.IsFinite())
{
axis.X = (axis.X > 0) ? 1f : 0f;
axis.Y = (axis.Y > 0) ? 1f : 0f;
axis.Z = (axis.Z > 0) ? 1f : 0f;
m_log.DebugFormat("[axislock]: <{0},{1},{2}>", axis.X, axis.Y, axis.Z);
- m_taintAngularLock = new PhysicsVector(axis.X, axis.Y, axis.Z);
+ m_taintAngularLock = axis;
}
else
{
@@ -2566,7 +2561,7 @@ Console.WriteLine(" JointCreateFixed");
// no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit!
if (_parent == null)
{
- PhysicsVector pv = new PhysicsVector(0, 0, 0);
+ Vector3 pv = Vector3.Zero;
bool lastZeroFlag = _zeroFlag;
if (Body != (IntPtr)0) // FIXME -> or if it is a joint
{
@@ -2575,9 +2570,9 @@ Console.WriteLine(" JointCreateFixed");
d.Vector3 vel = d.BodyGetLinearVel(Body);
d.Vector3 rotvel = d.BodyGetAngularVel(Body);
d.Vector3 torque = d.BodyGetTorque(Body);
- _torque.setValues(torque.X, torque.Y, torque.Z);
- PhysicsVector l_position = new PhysicsVector();
- Quaternion l_orientation = new Quaternion();
+ _torque = new Vector3(torque.X, torque.Y, torque.Z);
+ Vector3 l_position = Vector3.Zero;
+ Quaternion l_orientation = Quaternion.Identity;
// kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!)
//if (vec.X < 0.0f) { vec.X = 0.0f; if (Body != (IntPtr)0) d.BodySetAngularVel(Body, 0, 0, 0); }
@@ -2712,16 +2707,16 @@ Console.WriteLine(" JointCreateFixed");
_velocity.Z = vel.Z;
_acceleration = ((_velocity - m_lastVelocity) / 0.1f);
- _acceleration = new PhysicsVector(_velocity.X - m_lastVelocity.X / 0.1f, _velocity.Y - m_lastVelocity.Y / 0.1f, _velocity.Z - m_lastVelocity.Z / 0.1f);
+ _acceleration = new Vector3(_velocity.X - m_lastVelocity.X / 0.1f, _velocity.Y - m_lastVelocity.Y / 0.1f, _velocity.Z - m_lastVelocity.Z / 0.1f);
//m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString());
- if (_velocity.IsIdentical(pv, 0.5f))
+ if (_velocity.ApproxEquals(pv, 0.5f))
{
m_rotationalVelocity = pv;
}
else
{
- m_rotationalVelocity.setValues(rotvel.X, rotvel.Y, rotvel.Z);
+ m_rotationalVelocity = new Vector3(rotvel.X, rotvel.Y, rotvel.Z);
}
//m_log.Debug("ODE: " + m_rotationalVelocity.ToString());
@@ -2769,15 +2764,15 @@ Console.WriteLine(" JointCreateFixed");
}
}
- public override void SetMomentum(PhysicsVector momentum)
+ public override void SetMomentum(Vector3 momentum)
{
}
- public override PhysicsVector PIDTarget
+ public override Vector3 PIDTarget
{
set
{
- if (PhysicsVector.isFinite(value))
+ if (value.IsFinite())
{
m_PIDTarget = value;
}
@@ -2793,7 +2788,7 @@ Console.WriteLine(" JointCreateFixed");
public override PIDHoverType PIDHoverType { set { m_PIDHoverType = value; } }
public override float PIDHoverTau { set { m_PIDHoverTau = value; } }
- private void createAMotor(PhysicsVector axis)
+ private void createAMotor(Vector3 axis)
{
if (Body == IntPtr.Zero)
return;
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 0eb0c45..2f42646 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -684,7 +684,7 @@ namespace OpenSim.Region.Physics.OdePlugin
///
///
/// Returns which split up space the given position is in.
- public string whichspaceamIin(PhysicsVector pos)
+ public string whichspaceamIin(Vector3 pos)
{
return calculateSpaceForGeom(pos).ToString();
}
@@ -963,7 +963,7 @@ namespace OpenSim.Region.Physics.OdePlugin
//p2.CollidingObj = true;
contacts[i].depth = 0.00000003f;
- p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 0.5f);
+ p2.Velocity = p2.Velocity + new Vector3(0f, 0f, 0.5f);
contacts[i].pos =
new d.Vector3(contacts[i].pos.X + (p1.Size.X/2),
contacts[i].pos.Y + (p1.Size.Y/2),
@@ -981,7 +981,7 @@ namespace OpenSim.Region.Physics.OdePlugin
//p2.CollidingObj = true;
contacts[i].depth = 0.00000003f;
- p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 0.5f);
+ p1.Velocity = p1.Velocity + new Vector3(0f, 0f, 0.5f);
contacts[i].pos =
new d.Vector3(contacts[i].pos.X + (p1.Size.X/2),
contacts[i].pos.Y + (p1.Size.Y/2),
@@ -1646,9 +1646,9 @@ namespace OpenSim.Region.Physics.OdePlugin
#region Add/Remove Entities
- public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying)
+ public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying)
{
- PhysicsVector pos = new PhysicsVector();
+ Vector3 pos;
pos.X = position.X;
pos.Y = position.Y;
pos.Z = position.Z;
@@ -1698,18 +1698,12 @@ namespace OpenSim.Region.Physics.OdePlugin
}
- private PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, Quaternion rotation,
+ private PhysicsActor AddPrim(String name, Vector3 position, Vector3 size, Quaternion rotation,
IMesh mesh, PrimitiveBaseShape pbs, bool isphysical)
{
-
- PhysicsVector pos = new PhysicsVector(position.X, position.Y, position.Z);
- //pos.X = position.X;
- //pos.Y = position.Y;
- //pos.Z = position.Z;
- PhysicsVector siz = new PhysicsVector();
- siz.X = size.X;
- siz.Y = size.Y;
- siz.Z = size.Z;
+
+ Vector3 pos = position;
+ Vector3 siz = size;
Quaternion rot = rotation;
OdePrim newPrim;
@@ -1736,14 +1730,14 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
- public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position,
- PhysicsVector size, Quaternion rotation) //To be removed
+ public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,
+ Vector3 size, Quaternion rotation) //To be removed
{
return AddPrimShape(primName, pbs, position, size, rotation, false);
}
- public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position,
- PhysicsVector size, Quaternion rotation, bool isPhysical)
+ public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,
+ Vector3 size, Quaternion rotation, bool isPhysical)
{
PhysicsActor result;
IMesh mesh = null;
@@ -1976,7 +1970,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// this joint will just be added to a waiting list that is NOT processed during the main
// Simulate() loop (to avoid deadlocks). After Simulate() is finished, we handle unprocessed joint requests.
- public override PhysicsJoint RequestJointCreation(string objectNameInScene, PhysicsJointType jointType, PhysicsVector position,
+ public override PhysicsJoint RequestJointCreation(string objectNameInScene, PhysicsJointType jointType, Vector3 position,
Quaternion rotation, string parms, List bodyNames, string trackedBodyName, Quaternion localRotation)
{
@@ -1984,7 +1978,7 @@ namespace OpenSim.Region.Physics.OdePlugin
OdePhysicsJoint joint = new OdePhysicsJoint();
joint.ObjectNameInScene = objectNameInScene;
joint.Type = jointType;
- joint.Position = new PhysicsVector(position.X, position.Y, position.Z);
+ joint.Position = position;
joint.Rotation = rotation;
joint.RawParams = parms;
joint.BodyNames = new List(bodyNames);
@@ -2036,7 +2030,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
// normally called from within OnJointMoved, which is called from within a lock (OdeLock)
- public override PhysicsVector GetJointAnchor(PhysicsJoint joint)
+ public override Vector3 GetJointAnchor(PhysicsJoint joint)
{
Debug.Assert(joint.IsInPhysicsEngine);
d.Vector3 pos = new d.Vector3();
@@ -2058,14 +2052,14 @@ namespace OpenSim.Region.Physics.OdePlugin
break;
}
}
- return new PhysicsVector(pos.X, pos.Y, pos.Z);
+ return new Vector3(pos.X, pos.Y, pos.Z);
}
// normally called from within OnJointMoved, which is called from within a lock (OdeLock)
// WARNING: ODE sometimes returns <0,0,0> as the joint axis! Therefore this function
// appears to be unreliable. Fortunately we can compute the joint axis ourselves by
// keeping track of the joint's original orientation relative to one of the involved bodies.
- public override PhysicsVector GetJointAxis(PhysicsJoint joint)
+ public override Vector3 GetJointAxis(PhysicsJoint joint)
{
Debug.Assert(joint.IsInPhysicsEngine);
d.Vector3 axis = new d.Vector3();
@@ -2087,7 +2081,7 @@ namespace OpenSim.Region.Physics.OdePlugin
break;
}
}
- return new PhysicsVector(axis.X, axis.Y, axis.Z);
+ return new Vector3(axis.X, axis.Y, axis.Z);
}
@@ -2255,7 +2249,7 @@ namespace OpenSim.Region.Physics.OdePlugin
/// the position that the geom moved to
/// a pointer to the space it was in before it was moved.
/// a pointer to the new space it's in
- public IntPtr recalculateSpaceForGeom(IntPtr geom, PhysicsVector pos, IntPtr currentspace)
+ public IntPtr recalculateSpaceForGeom(IntPtr geom, Vector3 pos, IntPtr currentspace)
{
// Called from setting the Position and Size of an ODEPrim so
// it's already in locked space.
@@ -2402,7 +2396,7 @@ namespace OpenSim.Region.Physics.OdePlugin
///
///
/// a pointer to the space. This could be a new space or reused space.
- public IntPtr calculateSpaceForGeom(PhysicsVector pos)
+ public IntPtr calculateSpaceForGeom(Vector3 pos)
{
int[] xyspace = calculateSpaceArrayItemFromPos(pos);
//m_log.Info("[Physics]: Attempting to use arrayItem: " + xyspace[0].ToString() + "," + xyspace[1].ToString());
@@ -2414,7 +2408,7 @@ namespace OpenSim.Region.Physics.OdePlugin
///
///
/// an array item based on the position
- public int[] calculateSpaceArrayItemFromPos(PhysicsVector pos)
+ public int[] calculateSpaceArrayItemFromPos(Vector3 pos)
{
int[] returnint = new int[2];
diff --git a/OpenSim/Region/Physics/OdePlugin/Tests/ODETestClass.cs b/OpenSim/Region/Physics/OdePlugin/Tests/ODETestClass.cs
index cdd38c4..69e2d03 100644
--- a/OpenSim/Region/Physics/OdePlugin/Tests/ODETestClass.cs
+++ b/OpenSim/Region/Physics/OdePlugin/Tests/ODETestClass.cs
@@ -76,8 +76,8 @@ namespace OpenSim.Region.Physics.OdePlugin
public void CreateAndDropPhysicalCube()
{
PrimitiveBaseShape newcube = PrimitiveBaseShape.CreateBox();
- PhysicsVector position = new PhysicsVector(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128);
- PhysicsVector size = new PhysicsVector(0.5f, 0.5f, 0.5f);
+ Vector3 position = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 128f);
+ Vector3 size = new Vector3(0.5f, 0.5f, 0.5f);
Quaternion rot = Quaternion.Identity;
PhysicsActor prim = ps.AddPrimShape("CoolShape", newcube, position, size, rot, true);
OdePrim oprim = (OdePrim)prim;
diff --git a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
index 35fc616..26cd1dd 100644
--- a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
+++ b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
@@ -36,20 +36,17 @@ namespace OpenSim.Region.Physics.POSPlugin
{
public class POSCharacter : PhysicsActor
{
- private PhysicsVector _position;
- public PhysicsVector _velocity;
- public PhysicsVector _target_velocity = PhysicsVector.Zero;
- public PhysicsVector _size = PhysicsVector.Zero;
- private PhysicsVector _acceleration;
- private PhysicsVector m_rotationalVelocity = PhysicsVector.Zero;
+ private Vector3 _position;
+ public Vector3 _velocity;
+ public Vector3 _target_velocity = Vector3.Zero;
+ public Vector3 _size = Vector3.Zero;
+ private Vector3 _acceleration;
+ private Vector3 m_rotationalVelocity = Vector3.Zero;
private bool flying;
private bool isColliding;
public POSCharacter()
{
- _velocity = new PhysicsVector();
- _position = new PhysicsVector();
- _acceleration = new PhysicsVector();
}
public override int PhysicsActorType
@@ -58,7 +55,7 @@ namespace OpenSim.Region.Physics.POSPlugin
set { return; }
}
- public override PhysicsVector RotationalVelocity
+ public override Vector3 RotationalVelocity
{
get { return m_rotationalVelocity; }
set { m_rotationalVelocity = value; }
@@ -137,13 +134,13 @@ namespace OpenSim.Region.Physics.POSPlugin
get { return false; }
}
- public override PhysicsVector Position
+ public override Vector3 Position
{
get { return _position; }
set { _position = value; }
}
- public override PhysicsVector Size
+ public override Vector3 Size
{
get { return _size; }
set
@@ -158,9 +155,9 @@ namespace OpenSim.Region.Physics.POSPlugin
get { return 0f; }
}
- public override PhysicsVector Force
+ public override Vector3 Force
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
set { return; }
}
@@ -175,7 +172,7 @@ namespace OpenSim.Region.Physics.POSPlugin
}
- public override void VehicleVectorParam(int param, PhysicsVector value)
+ public override void VehicleVectorParam(int param, Vector3 value)
{
}
@@ -190,14 +187,14 @@ namespace OpenSim.Region.Physics.POSPlugin
}
- public override PhysicsVector CenterOfMass
+ public override Vector3 CenterOfMass
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
- public override PhysicsVector GeometricCenter
+ public override Vector3 GeometricCenter
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
public override PrimitiveBaseShape Shape
@@ -205,15 +202,15 @@ namespace OpenSim.Region.Physics.POSPlugin
set { return; }
}
- public override PhysicsVector Velocity
+ public override Vector3 Velocity
{
get { return _velocity; }
set { _target_velocity = value; }
}
- public override PhysicsVector Torque
+ public override Vector3 Torque
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
set { return; }
}
@@ -229,7 +226,7 @@ namespace OpenSim.Region.Physics.POSPlugin
set { }
}
- public override PhysicsVector Acceleration
+ public override Vector3 Acceleration
{
get { return _acceleration; }
}
@@ -248,24 +245,24 @@ namespace OpenSim.Region.Physics.POSPlugin
{
}
- public override void LockAngularMotion(PhysicsVector axis)
+ public override void LockAngularMotion(Vector3 axis)
{
}
- public void SetAcceleration(PhysicsVector accel)
+ public void SetAcceleration(Vector3 accel)
{
_acceleration = accel;
}
- public override void AddForce(PhysicsVector force, bool pushforce)
+ public override void AddForce(Vector3 force, bool pushforce)
{
}
- public override void AddAngularForce(PhysicsVector force, bool pushforce)
+ public override void AddAngularForce(Vector3 force, bool pushforce)
{
}
- public override void SetMomentum(PhysicsVector momentum)
+ public override void SetMomentum(Vector3 momentum)
{
}
@@ -273,7 +270,7 @@ namespace OpenSim.Region.Physics.POSPlugin
{
}
- public override PhysicsVector PIDTarget
+ public override Vector3 PIDTarget
{
set { return; }
}
diff --git a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
index b50364b..96c3e26 100644
--- a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
+++ b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
@@ -36,19 +36,16 @@ namespace OpenSim.Region.Physics.POSPlugin
{
public class POSPrim : PhysicsActor
{
- private PhysicsVector _position;
- private PhysicsVector _velocity;
- private PhysicsVector _acceleration;
- private PhysicsVector _size;
- private PhysicsVector m_rotationalVelocity = PhysicsVector.Zero;
+ private Vector3 _position;
+ private Vector3 _velocity;
+ private Vector3 _acceleration;
+ private Vector3 _size;
+ private Vector3 m_rotationalVelocity = Vector3.Zero;
private Quaternion _orientation;
private bool iscolliding;
public POSPrim()
{
- _velocity = new PhysicsVector();
- _position = new PhysicsVector();
- _acceleration = new PhysicsVector();
}
public override int PhysicsActorType
@@ -57,7 +54,7 @@ namespace OpenSim.Region.Physics.POSPlugin
set { return; }
}
- public override PhysicsVector RotationalVelocity
+ public override Vector3 RotationalVelocity
{
get { return m_rotationalVelocity; }
set { m_rotationalVelocity = value; }
@@ -98,13 +95,13 @@ namespace OpenSim.Region.Physics.POSPlugin
get { return false; }
}
- public override PhysicsVector Position
+ public override Vector3 Position
{
get { return _position; }
set { _position = value; }
}
- public override PhysicsVector Size
+ public override Vector3 Size
{
get { return _size; }
set { _size = value; }
@@ -115,9 +112,9 @@ namespace OpenSim.Region.Physics.POSPlugin
get { return 0f; }
}
- public override PhysicsVector Force
+ public override Vector3 Force
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
set { return; }
}
@@ -132,7 +129,7 @@ namespace OpenSim.Region.Physics.POSPlugin
}
- public override void VehicleVectorParam(int param, PhysicsVector value)
+ public override void VehicleVectorParam(int param, Vector3 value)
{
}
@@ -147,14 +144,14 @@ namespace OpenSim.Region.Physics.POSPlugin
}
- public override PhysicsVector CenterOfMass
+ public override Vector3 CenterOfMass
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
- public override PhysicsVector GeometricCenter
+ public override Vector3 GeometricCenter
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
public override PrimitiveBaseShape Shape
@@ -173,7 +170,7 @@ namespace OpenSim.Region.Physics.POSPlugin
set { return; }
}
- public override PhysicsVector Velocity
+ public override Vector3 Velocity
{
get { return _velocity; }
set { _velocity = value; }
@@ -191,7 +188,7 @@ namespace OpenSim.Region.Physics.POSPlugin
set { _orientation = value; }
}
- public override PhysicsVector Acceleration
+ public override Vector3 Acceleration
{
get { return _acceleration; }
}
@@ -202,26 +199,26 @@ namespace OpenSim.Region.Physics.POSPlugin
set { }
}
- public void SetAcceleration(PhysicsVector accel)
+ public void SetAcceleration(Vector3 accel)
{
_acceleration = accel;
}
- public override void AddForce(PhysicsVector force, bool pushforce)
+ public override void AddForce(Vector3 force, bool pushforce)
{
}
- public override void AddAngularForce(PhysicsVector force, bool pushforce)
+ public override void AddAngularForce(Vector3 force, bool pushforce)
{
}
- public override PhysicsVector Torque
+ public override Vector3 Torque
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
set { return; }
}
- public override void SetMomentum(PhysicsVector momentum)
+ public override void SetMomentum(Vector3 momentum)
{
}
@@ -255,7 +252,7 @@ namespace OpenSim.Region.Physics.POSPlugin
{
}
- public override void LockAngularMotion(PhysicsVector axis)
+ public override void LockAngularMotion(Vector3 axis)
{
}
@@ -268,7 +265,7 @@ namespace OpenSim.Region.Physics.POSPlugin
{
}
- public override PhysicsVector PIDTarget
+ public override Vector3 PIDTarget
{
set { return; }
}
diff --git a/OpenSim/Region/Physics/POSPlugin/POSScene.cs b/OpenSim/Region/Physics/POSPlugin/POSScene.cs
index fa8cc70..c3f5040 100644
--- a/OpenSim/Region/Physics/POSPlugin/POSScene.cs
+++ b/OpenSim/Region/Physics/POSPlugin/POSScene.cs
@@ -56,7 +56,7 @@ namespace OpenSim.Region.Physics.POSPlugin
{
}
- public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying)
+ public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying)
{
POSCharacter act = new POSCharacter();
act.Position = position;
@@ -84,20 +84,20 @@ namespace OpenSim.Region.Physics.POSPlugin
}
/*
- public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation)
+ public override PhysicsActor AddPrim(Vector3 position, Vector3 size, Quaternion rotation)
{
return null;
}
*/
- public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position,
- PhysicsVector size, Quaternion rotation)
+ public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,
+ Vector3 size, Quaternion rotation)
{
return AddPrimShape(primName, pbs, position, size, rotation, false);
}
- public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position,
- PhysicsVector size, Quaternion rotation, bool isPhysical)
+ public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,
+ Vector3 size, Quaternion rotation, bool isPhysical)
{
POSPrim prim = new POSPrim();
prim.Position = position;
@@ -152,23 +152,25 @@ namespace OpenSim.Region.Physics.POSPlugin
character._target_velocity.Z += gravity * timeStep;
}
- character.Position.X += character._target_velocity.X * timeStep;
- character.Position.Y += character._target_velocity.Y * timeStep;
+ Vector3 characterPosition = character.Position;
- character.Position.X = Util.Clamp(character.Position.X, 0.01f, Constants.RegionSize - 0.01f);
- character.Position.Y = Util.Clamp(character.Position.Y, 0.01f, Constants.RegionSize - 0.01f);
+ characterPosition.X += character._target_velocity.X * timeStep;
+ characterPosition.Y += character._target_velocity.Y * timeStep;
+
+ characterPosition.X = Util.Clamp(character.Position.X, 0.01f, Constants.RegionSize - 0.01f);
+ characterPosition.Y = Util.Clamp(character.Position.Y, 0.01f, Constants.RegionSize - 0.01f);
bool forcedZ = false;
float terrainheight = _heightMap[(int)character.Position.Y * Constants.RegionSize + (int)character.Position.X];
if (character.Position.Z + (character._target_velocity.Z * timeStep) < terrainheight + 2)
{
- character.Position.Z = terrainheight + character.Size.Z;
+ characterPosition.Z = terrainheight + character.Size.Z;
forcedZ = true;
}
else
{
- character.Position.Z += character._target_velocity.Z*timeStep;
+ characterPosition.Z += character._target_velocity.Z*timeStep;
}
/// this is it -- the magic you've all been waiting for! Ladies and gentlemen --
@@ -177,29 +179,29 @@ namespace OpenSim.Region.Physics.POSPlugin
if (isCollidingWithPrim(character))
{
- character.Position.Z = oldposZ; // first try Z axis
+ characterPosition.Z = oldposZ; // first try Z axis
if (isCollidingWithPrim(character))
{
- character.Position.Z = oldposZ + character.Size.Z / 4.4f; // try harder
+ characterPosition.Z = oldposZ + character.Size.Z / 4.4f; // try harder
if (isCollidingWithPrim(character))
{
- character.Position.Z = oldposZ + character.Size.Z / 2.2f; // try very hard
+ characterPosition.Z = oldposZ + character.Size.Z / 2.2f; // try very hard
if (isCollidingWithPrim(character))
{
- character.Position.X = oldposX;
- character.Position.Y = oldposY;
- character.Position.Z = oldposZ;
+ characterPosition.X = oldposX;
+ characterPosition.Y = oldposY;
+ characterPosition.Z = oldposZ;
- character.Position.X += character._target_velocity.X * timeStep;
+ characterPosition.X += character._target_velocity.X * timeStep;
if (isCollidingWithPrim(character))
{
- character.Position.X = oldposX;
+ characterPosition.X = oldposX;
}
- character.Position.Y += character._target_velocity.Y * timeStep;
+ characterPosition.Y += character._target_velocity.Y * timeStep;
if (isCollidingWithPrim(character))
{
- character.Position.Y = oldposY;
+ characterPosition.Y = oldposY;
}
}
else
@@ -218,8 +220,10 @@ namespace OpenSim.Region.Physics.POSPlugin
}
}
- character.Position.X = Util.Clamp(character.Position.X, 0.01f, Constants.RegionSize - 0.01f);
- character.Position.Y = Util.Clamp(character.Position.Y, 0.01f, Constants.RegionSize - 0.01f);
+ characterPosition.X = Util.Clamp(character.Position.X, 0.01f, Constants.RegionSize - 0.01f);
+ characterPosition.Y = Util.Clamp(character.Position.Y, 0.01f, Constants.RegionSize - 0.01f);
+
+ character.Position = characterPosition;
character._velocity.X = (character.Position.X - oldposX)/timeStep;
character._velocity.Y = (character.Position.Y - oldposY)/timeStep;
diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
index e7d989c..8bdb18d 100644
--- a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
+++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
@@ -34,6 +34,7 @@ using PhysXWrapper;
using Quaternion=OpenMetaverse.Quaternion;
using System.Reflection;
using log4net;
+using OpenMetaverse;
namespace OpenSim.Region.Physics.PhysXPlugin
{
@@ -106,7 +107,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
}
- public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying)
+ public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying)
{
Vec3 pos = new Vec3();
pos.X = position.X;
@@ -127,7 +128,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
{
}
- private PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation)
+ private PhysicsActor AddPrim(Vector3 position, Vector3 size, Quaternion rotation)
{
Vec3 pos = new Vec3();
pos.X = position.X;
@@ -142,14 +143,14 @@ namespace OpenSim.Region.Physics.PhysXPlugin
return act;
}
- public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position,
- PhysicsVector size, Quaternion rotation) //To be removed
+ public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,
+ Vector3 size, Quaternion rotation) //To be removed
{
return AddPrimShape(primName, pbs, position, size, rotation, false);
}
- public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position,
- PhysicsVector size, Quaternion rotation, bool isPhysical)
+ public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,
+ Vector3 size, Quaternion rotation, bool isPhysical)
{
return AddPrim(position, size, rotation);
}
@@ -219,10 +220,10 @@ namespace OpenSim.Region.Physics.PhysXPlugin
public class PhysXCharacter : PhysicsActor
{
- private PhysicsVector _position;
- private PhysicsVector _velocity;
- private PhysicsVector m_rotationalVelocity = PhysicsVector.Zero;
- private PhysicsVector _acceleration;
+ private Vector3 _position;
+ private Vector3 _velocity;
+ private Vector3 m_rotationalVelocity = Vector3.Zero;
+ private Vector3 _acceleration;
private NxCharacter _character;
private bool flying;
private bool iscolliding = false;
@@ -230,9 +231,6 @@ namespace OpenSim.Region.Physics.PhysXPlugin
public PhysXCharacter(NxCharacter character)
{
- _velocity = new PhysicsVector();
- _position = new PhysicsVector();
- _acceleration = new PhysicsVector();
_character = character;
}
@@ -310,7 +308,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
set { return; }
}
- public override PhysicsVector RotationalVelocity
+ public override Vector3 RotationalVelocity
{
get { return m_rotationalVelocity; }
set { m_rotationalVelocity = value; }
@@ -321,7 +319,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
get { return false; }
}
- public override PhysicsVector Position
+ public override Vector3 Position
{
get { return _position; }
set
@@ -335,9 +333,9 @@ namespace OpenSim.Region.Physics.PhysXPlugin
}
}
- public override PhysicsVector Size
+ public override Vector3 Size
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
set { }
}
@@ -346,9 +344,9 @@ namespace OpenSim.Region.Physics.PhysXPlugin
get { return 0f; }
}
- public override PhysicsVector Force
+ public override Vector3 Force
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
set { return; }
}
@@ -363,7 +361,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
}
- public override void VehicleVectorParam(int param, PhysicsVector value)
+ public override void VehicleVectorParam(int param, Vector3 value)
{
}
@@ -379,17 +377,17 @@ namespace OpenSim.Region.Physics.PhysXPlugin
}
- public override PhysicsVector CenterOfMass
+ public override Vector3 CenterOfMass
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
- public override PhysicsVector GeometricCenter
+ public override Vector3 GeometricCenter
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
- public override PhysicsVector Velocity
+ public override Vector3 Velocity
{
get { return _velocity; }
set { _velocity = value; }
@@ -413,25 +411,25 @@ namespace OpenSim.Region.Physics.PhysXPlugin
set { }
}
- public override PhysicsVector Acceleration
+ public override Vector3 Acceleration
{
get { return _acceleration; }
}
- public void SetAcceleration(PhysicsVector accel)
+ public void SetAcceleration(Vector3 accel)
{
_acceleration = accel;
}
- public override void AddForce(PhysicsVector force, bool pushforce)
+ public override void AddForce(Vector3 force, bool pushforce)
{
}
- public override PhysicsVector Torque
+ public override Vector3 Torque
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
set { return; }
}
- public override void AddAngularForce(PhysicsVector force, bool pushforce)
+ public override void AddAngularForce(Vector3 force, bool pushforce)
{
}
@@ -445,12 +443,12 @@ namespace OpenSim.Region.Physics.PhysXPlugin
}
- public override void LockAngularMotion(PhysicsVector axis)
+ public override void LockAngularMotion(Vector3 axis)
{
}
- public override void SetMomentum(PhysicsVector momentum)
+ public override void SetMomentum(Vector3 momentum)
{
}
@@ -492,7 +490,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
}
- public override PhysicsVector PIDTarget { set { return; } }
+ public override Vector3 PIDTarget { set { return; } }
public override bool PIDActive { set { return; } }
public override float PIDTau { set { return; } }
@@ -518,15 +516,15 @@ namespace OpenSim.Region.Physics.PhysXPlugin
public class PhysXPrim : PhysicsActor
{
- private PhysicsVector _velocity;
- private PhysicsVector _acceleration;
- private PhysicsVector m_rotationalVelocity;
+ private Vector3 _velocity;
+ private Vector3 _acceleration;
+ private Vector3 m_rotationalVelocity;
private NxActor _prim;
public PhysXPrim(NxActor prim)
{
- _velocity = new PhysicsVector();
- _acceleration = new PhysicsVector();
+ _velocity = Vector3.Zero;
+ _acceleration = Vector3.Zero;
_prim = prim;
}
@@ -580,7 +578,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
set { return; }
}
- public override PhysicsVector RotationalVelocity
+ public override Vector3 RotationalVelocity
{
get { return m_rotationalVelocity; }
set { m_rotationalVelocity = value; }
@@ -616,11 +614,11 @@ namespace OpenSim.Region.Physics.PhysXPlugin
get { return false; }
}
- public override PhysicsVector Position
+ public override Vector3 Position
{
get
{
- PhysicsVector pos = new PhysicsVector();
+ Vector3 pos = Vector3.Zero;
Vec3 vec = _prim.Position;
pos.X = vec.X;
pos.Y = vec.Y;
@@ -629,7 +627,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
}
set
{
- PhysicsVector vec = value;
+ Vector3 vec = value;
Vec3 pos = new Vec3();
pos.X = vec.X;
pos.Y = vec.Y;
@@ -643,15 +641,15 @@ namespace OpenSim.Region.Physics.PhysXPlugin
set { return; }
}
- public override PhysicsVector Velocity
+ public override Vector3 Velocity
{
get { return _velocity; }
set { _velocity = value; }
}
- public override PhysicsVector Torque
+ public override Vector3 Torque
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
set { return; }
}
@@ -682,31 +680,31 @@ namespace OpenSim.Region.Physics.PhysXPlugin
set { }
}
- public override PhysicsVector Acceleration
+ public override Vector3 Acceleration
{
get { return _acceleration; }
}
- public void SetAcceleration(PhysicsVector accel)
+ public void SetAcceleration(Vector3 accel)
{
_acceleration = accel;
}
- public override void AddForce(PhysicsVector force, bool pushforce)
+ public override void AddForce(Vector3 force, bool pushforce)
{
}
- public override void AddAngularForce(PhysicsVector force, bool pushforce)
+ public override void AddAngularForce(Vector3 force, bool pushforce)
{
}
- public override void SetMomentum(PhysicsVector momentum)
+ public override void SetMomentum(Vector3 momentum)
{
}
- public override PhysicsVector Size
+ public override Vector3 Size
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
set { }
}
@@ -718,7 +716,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
{
}
- public override void LockAngularMotion(PhysicsVector axis)
+ public override void LockAngularMotion(Vector3 axis)
{
}
@@ -728,9 +726,9 @@ namespace OpenSim.Region.Physics.PhysXPlugin
get { return 0f; }
}
- public override PhysicsVector Force
+ public override Vector3 Force
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
set { return; }
}
@@ -745,7 +743,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
}
- public override void VehicleVectorParam(int param, PhysicsVector value)
+ public override void VehicleVectorParam(int param, Vector3 value)
{
}
@@ -760,21 +758,21 @@ namespace OpenSim.Region.Physics.PhysXPlugin
}
- public override PhysicsVector CenterOfMass
+ public override Vector3 CenterOfMass
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
- public override PhysicsVector GeometricCenter
+ public override Vector3 GeometricCenter
{
- get { return PhysicsVector.Zero; }
+ get { return Vector3.Zero; }
}
public override void CrossingFailure()
{
}
- public override PhysicsVector PIDTarget { set { return; } }
+ public override Vector3 PIDTarget { set { return; } }
public override bool PIDActive { set { return; } }
public override float PIDTau { set { return; } }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 56d4d28..3849558 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2047,7 +2047,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (local != 0)
force *= llGetRot();
- m_host.ParentGroup.RootPart.SetForce(new PhysicsVector((float)force.x, (float)force.y, (float)force.z));
+ m_host.ParentGroup.RootPart.SetForce(new Vector3((float)force.x, (float)force.y, (float)force.z));
}
}
}
@@ -2062,7 +2062,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
if (!m_host.ParentGroup.IsDeleted)
{
- PhysicsVector tmpForce = m_host.ParentGroup.RootPart.GetForce();
+ Vector3 tmpForce = m_host.ParentGroup.RootPart.GetForce();
force.x = tmpForce.X;
force.y = tmpForce.Y;
force.z = tmpForce.Z;
@@ -4180,7 +4180,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
applied_linear_impulse *= m_host.GetWorldRotation();
}
- pusheeav.PhysicsActor.AddForce(new PhysicsVector(applied_linear_impulse.X, applied_linear_impulse.Y, applied_linear_impulse.Z), true);
+ pusheeav.PhysicsActor.AddForce(applied_linear_impulse, true);
}
}
}
@@ -6088,7 +6088,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (!m_host.ParentGroup.IsDeleted)
{
m_host.ParentGroup.RootPart.SetVehicleVectorParam(param,
- new PhysicsVector((float)vec.x, (float)vec.y, (float)vec.z));
+ new Vector3((float)vec.x, (float)vec.y, (float)vec.z));
}
}
}
--
cgit v1.1
From f5cad91578d9f7dbfb54d17bb476929e935682a8 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Mon, 26 Oct 2009 19:03:55 -0700
Subject: * Switched from OpenJPEG to CSJ2K in Meshmerizer * Tested the
previous patch and found no regressions
---
OpenSim/Region/Physics/Meshing/Meshmerizer.cs | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index a90a89a..fbe1949 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -31,7 +31,6 @@ using System.Collections.Generic;
using OpenSim.Framework;
using OpenSim.Region.Physics.Manager;
using OpenMetaverse;
-using OpenMetaverse.Imaging;
using System.Drawing;
using System.Drawing.Imaging;
using PrimMesher;
@@ -285,8 +284,7 @@ namespace OpenSim.Region.Physics.Meshing
try
{
- ManagedImage managedImage; // we never use this
- OpenJPEG.DecodeToImage(primShape.SculptData, out managedImage, out idata);
+ idata = CSJ2K.J2kImage.FromBytes(primShape.SculptData);
if (cacheSculptMaps)
{
--
cgit v1.1
From 322b39804d3659b637c2b9a4df13c247dfa561c6 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Mon, 26 Oct 2009 22:05:07 -0700
Subject: Adding missing CSJ2K reference to OpenSim.Region.Physics.Meshing
---
prebuild.xml | 1 +
1 file changed, 1 insertion(+)
diff --git a/prebuild.xml b/prebuild.xml
index 640d530..12e33e9 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -588,6 +588,7 @@
../../../../bin/
+
--
cgit v1.1
From c75d4156487b35aac47aa6818144862a99bb841c Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Tue, 27 Oct 2009 00:26:56 -0700
Subject: * Converts ClientManager.ForEach() (and as a result,
Scene.ForEachClient()) to use a non-blocking parallel method when operating
in async mode * Minor code readability cleanup
---
OpenSim/Framework/ClientManager.cs | 5 ++++-
OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 8 +++++---
OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | 2 +-
OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | 5 ++---
4 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/OpenSim/Framework/ClientManager.cs b/OpenSim/Framework/ClientManager.cs
index 61b59e7..baff2f4 100644
--- a/OpenSim/Framework/ClientManager.cs
+++ b/OpenSim/Framework/ClientManager.cs
@@ -204,7 +204,10 @@ namespace OpenSim.Framework
public void ForEach(Action action)
{
IClientAPI[] localArray = m_array;
- Parallel.ForEach(localArray, action);
+ Parallel.For(0, localArray.Length,
+ delegate(int i)
+ { action(localArray[i]); }
+ );
}
///
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 31028b3..f6a7a0c 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -2105,12 +2105,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks)
{
ViewerEffectPacket packet = (ViewerEffectPacket)PacketPool.Instance.GetPacket(PacketType.ViewerEffect);
- packet.Effect = effectBlocks;
+ packet.Header.Reliable = false;
+ packet.Header.Zerocoded = true;
packet.AgentData.AgentID = AgentId;
packet.AgentData.SessionID = SessionId;
- packet.Header.Reliable = false;
- packet.Header.Zerocoded = true;
+
+ packet.Effect = effectBlocks;
+
OutPacket(packet, ThrottleOutPacketType.State);
}
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index a823f3b..84a4959 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -372,7 +372,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OpenSim.Framework.LocklessQueue queue = m_packetOutboxes[category];
TokenBucket bucket = m_throttleCategories[category];
- if (m_throttleCategories[category].RemoveTokens(packet.Buffer.DataLength))
+ if (bucket.RemoveTokens(packet.Buffer.DataLength))
{
// Enough tokens were removed from the bucket, the packet will not be queued
return false;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index cfe32d0..1a91f0c 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -394,7 +394,7 @@ namespace OpenSim.Region.Framework.Scenes
void ProcessViewerEffect(IClientAPI remoteClient, List args)
{
// TODO: don't create new blocks if recycling an old packet
- List effectBlock = new List();
+ ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[args.Count];
for (int i = 0; i < args.Count; i++)
{
ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock();
@@ -404,9 +404,8 @@ namespace OpenSim.Region.Framework.Scenes
effect.ID = args[i].ID;
effect.Type = args[i].Type;
effect.TypeData = args[i].TypeData;
- effectBlock.Add(effect);
+ effectBlockArray[i] = effect;
}
- ViewerEffectPacket.EffectBlock[] effectBlockArray = effectBlock.ToArray();
ForEachClient(
delegate(IClientAPI client)
--
cgit v1.1
From b498693cff9b044e8ab3c7a88a18e9d67f16461b Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Tue, 27 Oct 2009 01:46:14 -0700
Subject: * Tweak to region module loading to check for a matching constructor
first instead of throwing and catching exceptions * Commenting out the MySQL
startup sequence that cleans out dropped attachments under the advice that it
is no longer relevant. If anything, it could be brought back as a database
cleanup console command * Updated to the latest libomv 0.8.0-pre.
UUID.TryParse() will no longer throw and catch exceptions for most failed
UUID parses
---
.../RegionModulesControllerPlugin.cs | 13 +++++----
OpenSim/Data/MySQL/MySQLLegacyRegionData.cs | 32 ++++++++++++---------
OpenSim/Tools/pCampBot/PhysicsBot.cs | 7 +++--
bin/OpenMetaverse.dll | Bin 1638400 -> 1642496 bytes
bin/OpenMetaverseTypes.dll | Bin 102400 -> 102400 bytes
5 files changed, 29 insertions(+), 23 deletions(-)
diff --git a/OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs b/OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs
index ddc37ed..6c0c74d 100644
--- a/OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs
+++ b/OpenSim/ApplicationPlugins/RegionModulesController/RegionModulesControllerPlugin.cs
@@ -341,14 +341,15 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
// Actually load it
INonSharedRegionModule module = null;
- try
- {
+
+ Type[] ctorParamTypes = new Type[ctorArgs.Length];
+ for (int i = 0; i < ctorParamTypes.Length; i++)
+ ctorParamTypes[i] = ctorArgs[i].GetType();
+
+ if (node.Type.GetConstructor(ctorParamTypes) != null)
module = (INonSharedRegionModule)Activator.CreateInstance(node.Type, ctorArgs);
- }
- catch
- {
+ else
module = (INonSharedRegionModule)Activator.CreateInstance(node.Type);
- }
// Check for replaceable interfaces
Type replaceableInterface = module.ReplaceableInterface;
diff --git a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
index c07963c..a807948 100644
--- a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
@@ -66,22 +66,26 @@ namespace OpenSim.Data.MySQL
Migration m = new Migration(m_Connection, assem, "RegionStore");
m.Update();
+ // NOTE: This is a very slow query that times out on regions with a lot of prims.
+ // I'm told that it is no longer relevant so it's commented out now, but if it
+ // is relevant it should be added as a console command instead of part of the
+ // startup phase
// Clean dropped attachments
//
- try
- {
- using (MySqlCommand cmd = m_Connection.CreateCommand())
- {
- cmd.CommandText = "delete from prims, primshapes using prims " +
- "left join primshapes on prims.uuid = primshapes.uuid " +
- "where PCode = 9 and State <> 0";
- ExecuteNonQuery(cmd);
- }
- }
- catch (MySqlException ex)
- {
- m_log.Error("[REGION DB]: Error cleaning up dropped attachments: " + ex.Message);
- }
+ //try
+ //{
+ // using (MySqlCommand cmd = m_Connection.CreateCommand())
+ // {
+ // cmd.CommandText = "delete from prims, primshapes using prims " +
+ // "left join primshapes on prims.uuid = primshapes.uuid " +
+ // "where PCode = 9 and State <> 0";
+ // ExecuteNonQuery(cmd);
+ // }
+ //}
+ //catch (MySqlException ex)
+ //{
+ // m_log.Error("[REGION DB]: Error cleaning up dropped attachments: " + ex.Message);
+ //}
}
private IDataReader ExecuteReader(MySqlCommand c)
diff --git a/OpenSim/Tools/pCampBot/PhysicsBot.cs b/OpenSim/Tools/pCampBot/PhysicsBot.cs
index 426ef29..38986a2 100644
--- a/OpenSim/Tools/pCampBot/PhysicsBot.cs
+++ b/OpenSim/Tools/pCampBot/PhysicsBot.cs
@@ -154,7 +154,7 @@ namespace pCampBot
client.Network.OnConnected += new NetworkManager.ConnectedCallback(this.Network_OnConnected);
client.Network.OnSimConnected += new NetworkManager.SimConnectedCallback(this.Network_OnConnected);
client.Network.OnDisconnected += new NetworkManager.DisconnectedCallback(this.Network_OnDisconnected);
- client.Objects.OnNewPrim += Objects_NewPrim;
+ client.Objects.ObjectUpdate += Objects_NewPrim;
//client.Assets.OnAssetReceived += Asset_ReceivedCallback;
if (client.Network.Login(firstname, lastname, password, "pCampBot", "Your name"))
{
@@ -369,8 +369,10 @@ namespace pCampBot
}
}
- public void Objects_NewPrim(Simulator simulator, Primitive prim, ulong regionHandle, ushort timeDilation)
+ public void Objects_NewPrim(object sender, PrimEventArgs args)
{
+ Primitive prim = args.Prim;
+
if (prim != null)
{
if (prim.Textures != null)
@@ -396,7 +398,6 @@ namespace pCampBot
client.Assets.RequestImage(prim.Sculpt.SculptTexture, ImageType.Normal, Asset_TextureCallback_Texture);
}
}
-
}
diff --git a/bin/OpenMetaverse.dll b/bin/OpenMetaverse.dll
index 3f9255e..8b07942 100644
Binary files a/bin/OpenMetaverse.dll and b/bin/OpenMetaverse.dll differ
diff --git a/bin/OpenMetaverseTypes.dll b/bin/OpenMetaverseTypes.dll
index 6cea131..331d58b 100644
Binary files a/bin/OpenMetaverseTypes.dll and b/bin/OpenMetaverseTypes.dll differ
--
cgit v1.1
From 3a1ee79ee4239213b35f6b73a65c127c2af977fb Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Tue, 27 Oct 2009 02:36:57 -0700
Subject: Finally hunted down the Parallel deadlock. Packets were being handled
asynchronously (filling up the threadpool with handlers), which would turn
around and try to do parallel operations on the starved threadpool. The
solution for now is to disable Parallel.cs operations until we can gracefully
handle parallel operations with a potentially starved threadpool
---
OpenSim/Region/Framework/Scenes/Scene.cs | 15 +++++++++------
bin/OpenSim.ini.example | 2 +-
2 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 6c34056..42051d0 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -120,7 +120,7 @@ namespace OpenSim.Region.Framework.Scenes
private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing
private int m_incrementsof15seconds;
private volatile bool m_backingup;
- private bool m_useAsyncWhenPossible = true;
+ private bool m_useAsyncWhenPossible;
private Dictionary m_returns = new Dictionary();
private Dictionary m_groupsWithTargets = new Dictionary();
@@ -480,7 +480,7 @@ namespace OpenSim.Region.Framework.Scenes
IConfig startupConfig = m_config.Configs["Startup"];
// Should we try to run loops synchronously or asynchronously?
- m_useAsyncWhenPossible = startupConfig.GetBoolean("use_async_when_possible", true);
+ m_useAsyncWhenPossible = startupConfig.GetBoolean("use_async_when_possible", false);
//Animation states
m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
@@ -4261,10 +4261,13 @@ namespace OpenSim.Region.Framework.Scenes
public void ForEachClient(Action action, bool doAsynchronous)
{
- if (doAsynchronous)
- m_clientManager.ForEach(action);
- else
- m_clientManager.ForEachSync(action);
+ // FIXME: Asynchronous iteration is disabled until we have a threading model that
+ // can support calling this function from an async packet handler without
+ // potentially deadlocking
+ //if (doAsynchronous)
+ // m_clientManager.ForEach(action);
+ //else
+ // m_clientManager.ForEachSync(action);
}
public bool TryGetClient(UUID avatarID, out IClientAPI client)
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 2adc87f..4f1799e 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -49,7 +49,7 @@
; in parallel. Running in parallel should increase performance
; on a multi-core system, but will make debugging more
; difficult if something deadlocks or times out
- use_async_when_possible = true
+ use_async_when_possible = false
; Max threads to allocate on the FireAndForget thread pool
; when running with the SmartThreadPool option above
--
cgit v1.1