aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework')
-rw-r--r--OpenSim/Framework/IRegionCommsListener.cs68
-rw-r--r--OpenSim/Framework/RegionCommsListener.cs204
-rw-r--r--OpenSim/Framework/Servers/BaseOpenSimServer.cs21
-rw-r--r--OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs3
-rw-r--r--OpenSim/Framework/Watchdog.cs15
5 files changed, 35 insertions, 276 deletions
diff --git a/OpenSim/Framework/IRegionCommsListener.cs b/OpenSim/Framework/IRegionCommsListener.cs
deleted file mode 100644
index cd59c63..0000000
--- a/OpenSim/Framework/IRegionCommsListener.cs
+++ /dev/null
@@ -1,68 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System.Collections.Generic;
29using OpenMetaverse;
30
31namespace OpenSim.Framework
32{
33 public delegate void ExpectUserDelegate(AgentCircuitData agent);
34
35
36 public delegate void UpdateNeighbours(List<RegionInfo> neighbours);
37
38 public delegate void AgentCrossing(UUID agentID, Vector3 position, bool isFlying);
39
40 public delegate void PrimCrossing(UUID primID, Vector3 position, bool isPhysical);
41
42 public delegate void AcknowledgeAgentCross(UUID agentID);
43
44 public delegate void AcknowledgePrimCross(UUID PrimID);
45
46 public delegate bool CloseAgentConnection(UUID agentID);
47
48 public delegate bool ChildAgentUpdate(ChildAgentDataUpdate cAgentData);
49
50 public delegate void LogOffUser(UUID agentID, UUID regionSecret, string message);
51
52 public delegate LandData GetLandData(uint x, uint y);
53
54 public interface IRegionCommsListener
55 {
56 event ExpectUserDelegate OnExpectUser;
57 event GenericCall2 OnExpectChildAgent;
58 event AgentCrossing OnAvatarCrossingIntoRegion;
59 event PrimCrossing OnPrimCrossingIntoRegion;
60 event AcknowledgeAgentCross OnAcknowledgeAgentCrossed;
61 event AcknowledgePrimCross OnAcknowledgePrimCrossed;
62 event UpdateNeighbours OnNeighboursUpdate;
63 event CloseAgentConnection OnCloseAgentConnection;
64 event ChildAgentUpdate OnChildAgentUpdate;
65 event LogOffUser OnLogOffUser;
66 event GetLandData OnGetLandData;
67 }
68}
diff --git a/OpenSim/Framework/RegionCommsListener.cs b/OpenSim/Framework/RegionCommsListener.cs
deleted file mode 100644
index 3e0955d..0000000
--- a/OpenSim/Framework/RegionCommsListener.cs
+++ /dev/null
@@ -1,204 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using OpenMetaverse;
31
32namespace OpenSim.Framework
33{
34 /// <summary>
35 /// Sandbox mode region comms listener. There is one of these per region
36 /// </summary>
37 public class RegionCommsListener : IRegionCommsListener
38 {
39 public string debugRegionName = String.Empty;
40 private AcknowledgeAgentCross handlerAcknowledgeAgentCrossed = null; // OnAcknowledgeAgentCrossed;
41 private AcknowledgePrimCross handlerAcknowledgePrimCrossed = null; // OnAcknowledgePrimCrossed;
42 private AgentCrossing handlerAvatarCrossingIntoRegion = null; // OnAvatarCrossingIntoRegion;
43 private ChildAgentUpdate handlerChildAgentUpdate = null; // OnChildAgentUpdate;
44 private CloseAgentConnection handlerCloseAgentConnection = null; // OnCloseAgentConnection;
45 private GenericCall2 handlerExpectChildAgent = null; // OnExpectChildAgent;
46 private ExpectUserDelegate handlerExpectUser = null; // OnExpectUser
47 private UpdateNeighbours handlerNeighboursUpdate = null; // OnNeighboursUpdate;
48// private PrimCrossing handlerPrimCrossingIntoRegion = null; // OnPrimCrossingIntoRegion;
49 private LogOffUser handlerLogOffUser = null;
50 private GetLandData handlerGetLandData = null;
51
52 #region IRegionCommsListener Members
53
54 public event ExpectUserDelegate OnExpectUser;
55 public event GenericCall2 OnExpectChildAgent;
56 public event AgentCrossing OnAvatarCrossingIntoRegion;
57 public event PrimCrossing OnPrimCrossingIntoRegion;
58 public event UpdateNeighbours OnNeighboursUpdate;
59 public event AcknowledgeAgentCross OnAcknowledgeAgentCrossed;
60 public event AcknowledgePrimCross OnAcknowledgePrimCrossed;
61 public event CloseAgentConnection OnCloseAgentConnection;
62 public event ChildAgentUpdate OnChildAgentUpdate;
63 public event LogOffUser OnLogOffUser;
64 public event GetLandData OnGetLandData;
65
66 #endregion
67
68 /// <summary>
69 ///
70 /// </summary>
71 /// <param name="agent"></param>
72 /// <returns></returns>
73 public virtual bool TriggerExpectUser(AgentCircuitData agent)
74 {
75 handlerExpectUser = OnExpectUser;
76 if (handlerExpectUser != null)
77 {
78 handlerExpectUser(agent);
79 return true;
80 }
81
82 return false;
83 }
84
85 // From User Server
86 public virtual void TriggerLogOffUser(UUID agentID, UUID RegionSecret, string message)
87 {
88 handlerLogOffUser = OnLogOffUser;
89 if (handlerLogOffUser != null)
90 {
91 handlerLogOffUser(agentID, RegionSecret, message);
92 }
93
94 }
95
96 public virtual bool TriggerChildAgentUpdate(ChildAgentDataUpdate cAgentData)
97 {
98 handlerChildAgentUpdate = OnChildAgentUpdate;
99 if (handlerChildAgentUpdate != null)
100 {
101 handlerChildAgentUpdate(cAgentData);
102 return true;
103 }
104 return false;
105 }
106
107 public virtual bool TriggerExpectAvatarCrossing(UUID agentID, Vector3 position, bool isFlying)
108 {
109 handlerAvatarCrossingIntoRegion = OnAvatarCrossingIntoRegion;
110 if (handlerAvatarCrossingIntoRegion != null)
111 {
112 handlerAvatarCrossingIntoRegion(agentID, position, isFlying);
113 return true;
114 }
115 return false;
116 }
117
118 public virtual bool TriggerAcknowledgeAgentCrossed(UUID agentID)
119 {
120 handlerAcknowledgeAgentCrossed = OnAcknowledgeAgentCrossed;
121 if (handlerAcknowledgeAgentCrossed != null)
122 {
123 handlerAcknowledgeAgentCrossed(agentID);
124 return true;
125 }
126 return false;
127 }
128
129 public virtual bool TriggerAcknowledgePrimCrossed(UUID primID)
130 {
131 handlerAcknowledgePrimCrossed = OnAcknowledgePrimCrossed;
132 if (handlerAcknowledgePrimCrossed != null)
133 {
134 handlerAcknowledgePrimCrossed(primID);
135 return true;
136 }
137 return false;
138 }
139
140 public virtual bool TriggerCloseAgentConnection(UUID agentID)
141 {
142 handlerCloseAgentConnection = OnCloseAgentConnection;
143 if (handlerCloseAgentConnection != null)
144 {
145 handlerCloseAgentConnection(agentID);
146 return true;
147 }
148 return false;
149 }
150
151 /// <summary>
152 ///
153 /// </summary>
154 /// <remarks>TODO: Doesnt take any args??</remarks>
155 /// <returns></returns>
156 public virtual bool TriggerExpectChildAgent()
157 {
158 handlerExpectChildAgent = OnExpectChildAgent;
159 if (handlerExpectChildAgent != null)
160 {
161 handlerExpectChildAgent();
162 return true;
163 }
164
165 return false;
166 }
167
168 /// <summary>
169 ///
170 /// </summary>
171 /// <remarks>Added to avoid a unused compiler warning on OnNeighboursUpdate, TODO: Check me</remarks>
172 /// <param name="neighbours"></param>
173 /// <returns></returns>
174 public virtual bool TriggerOnNeighboursUpdate(List<RegionInfo> neighbours)
175 {
176 handlerNeighboursUpdate = OnNeighboursUpdate;
177 if (handlerNeighboursUpdate != null)
178 {
179 handlerNeighboursUpdate(neighbours);
180 return true;
181 }
182
183 return false;
184 }
185
186 public bool TriggerTellRegionToCloseChildConnection(UUID agentID)
187 {
188 handlerCloseAgentConnection = OnCloseAgentConnection;
189 if (handlerCloseAgentConnection != null)
190 return handlerCloseAgentConnection(agentID);
191
192 return false;
193 }
194
195 public LandData TriggerGetLandData(uint x, uint y)
196 {
197 handlerGetLandData = OnGetLandData;
198 if (handlerGetLandData != null)
199 return handlerGetLandData(x, y);
200
201 return null;
202 }
203 }
204}
diff --git a/OpenSim/Framework/Servers/BaseOpenSimServer.cs b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
index 66d0813..3551d5d 100644
--- a/OpenSim/Framework/Servers/BaseOpenSimServer.cs
+++ b/OpenSim/Framework/Servers/BaseOpenSimServer.cs
@@ -243,17 +243,32 @@ namespace OpenSim.Framework.Servers
243 /// </summary> 243 /// </summary>
244 protected string GetThreadsReport() 244 protected string GetThreadsReport()
245 { 245 {
246 // This should be a constant field.
247 string reportFormat = "{0,6} {1,35} {2,16} {3,13} {4,10} {5,30}";
248
246 StringBuilder sb = new StringBuilder(); 249 StringBuilder sb = new StringBuilder();
247 Watchdog.ThreadWatchdogInfo[] threads = Watchdog.GetThreads(); 250 Watchdog.ThreadWatchdogInfo[] threads = Watchdog.GetThreads();
248 251
249 sb.Append(threads.Length + " threads are being tracked:" + Environment.NewLine); 252 sb.Append(threads.Length + " threads are being tracked:" + Environment.NewLine);
253
254 int timeNow = Util.EnvironmentTickCount();
255
256 sb.AppendFormat(reportFormat, "ID", "NAME", "LAST UPDATE (MS)", "LIFETIME (MS)", "PRIORITY", "STATE");
257 sb.Append(Environment.NewLine);
258
250 foreach (Watchdog.ThreadWatchdogInfo twi in threads) 259 foreach (Watchdog.ThreadWatchdogInfo twi in threads)
251 { 260 {
252 Thread t = twi.Thread; 261 Thread t = twi.Thread;
253 262
254 sb.Append( 263 sb.AppendFormat(
255 "ID: " + t.ManagedThreadId + ", Name: " + t.Name + ", TimeRunning: " 264 reportFormat,
256 + "Pri: " + t.Priority + ", State: " + t.ThreadState); 265 t.ManagedThreadId,
266 t.Name,
267 timeNow - twi.LastTick,
268 timeNow - twi.FirstTick,
269 t.Priority,
270 t.ThreadState);
271
257 sb.Append(Environment.NewLine); 272 sb.Append(Environment.NewLine);
258 } 273 }
259 274
diff --git a/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs b/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs
index 16e56d2..5e171f0 100644
--- a/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs
+++ b/OpenSim/Framework/Servers/HttpServer/PollServiceWorkerThread.cs
@@ -69,6 +69,9 @@ namespace OpenSim.Framework.Servers.HttpServer
69 while (m_running) 69 while (m_running)
70 { 70 {
71 PollServiceHttpRequest req = m_request.Dequeue(); 71 PollServiceHttpRequest req = m_request.Dequeue();
72
73 Watchdog.UpdateThread();
74
72 try 75 try
73 { 76 {
74 if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id)) 77 if (req.PollServiceArgs.HasEvents(req.RequestID, req.PollServiceArgs.Id))
diff --git a/OpenSim/Framework/Watchdog.cs b/OpenSim/Framework/Watchdog.cs
index 4847675..fa94109 100644
--- a/OpenSim/Framework/Watchdog.cs
+++ b/OpenSim/Framework/Watchdog.cs
@@ -48,6 +48,18 @@ namespace OpenSim.Framework
48 public class ThreadWatchdogInfo 48 public class ThreadWatchdogInfo
49 { 49 {
50 public Thread Thread { get; private set; } 50 public Thread Thread { get; private set; }
51
52 /// <summary>
53 /// Approximate tick when this thread was started.
54 /// </summary>
55 /// <remarks>
56 /// Not terribly good since this quickly wraps around.
57 /// </remarks>
58 public int FirstTick { get; private set; }
59
60 /// <summary>
61 /// First time this heartbeat update was invoked
62 /// </summary>
51 public int LastTick { get; set; } 63 public int LastTick { get; set; }
52 64
53 /// <summary> 65 /// <summary>
@@ -64,7 +76,8 @@ namespace OpenSim.Framework
64 { 76 {
65 Thread = thread; 77 Thread = thread;
66 Timeout = timeout; 78 Timeout = timeout;
67 LastTick = Environment.TickCount & Int32.MaxValue; 79 FirstTick = Environment.TickCount & Int32.MaxValue;
80 LastTick = FirstTick;
68 } 81 }
69 } 82 }
70 83