diff options
author | John Hurliman | 2009-10-13 16:53:19 -0700 |
---|---|---|
committer | John Hurliman | 2009-10-13 16:53:19 -0700 |
commit | 395a8680c3633ca131e7481f765517311ef51710 (patch) | |
tree | e9c3634c3c37e6595b7743da88b236c12fc81422 | |
parent | * Rewrote ClientManager to remove Lindenisms from OpenSim core, improve perfo... (diff) | |
download | opensim-SC-395a8680c3633ca131e7481f765517311ef51710.zip opensim-SC-395a8680c3633ca131e7481f765517311ef51710.tar.gz opensim-SC-395a8680c3633ca131e7481f765517311ef51710.tar.bz2 opensim-SC-395a8680c3633ca131e7481f765517311ef51710.tar.xz |
* Fixed a bug where clients were being added to ClientManager twice
* Changed the ClientManager interface to reduce potential errors with duplicate or mismatched keys
* Added IClientAPI.RemoteEndPoint, which can (hopefully) eventually replace IClientAPI.CircuitCode
* Changed the order of operations during client shutdown
-rw-r--r-- | OpenSim/Framework/ClientManager.cs | 22 | ||||
-rw-r--r-- | OpenSim/Framework/IClientAPI.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 36 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs | 44 | ||||
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | 9 |
5 files changed, 54 insertions, 59 deletions
diff --git a/OpenSim/Framework/ClientManager.cs b/OpenSim/Framework/ClientManager.cs index 4edfabe..aefe425 100644 --- a/OpenSim/Framework/ClientManager.cs +++ b/OpenSim/Framework/ClientManager.cs | |||
@@ -97,19 +97,17 @@ namespace OpenSim.Framework | |||
97 | /// Add a client reference to the collection if it does not already | 97 | /// Add a client reference to the collection if it does not already |
98 | /// exist | 98 | /// exist |
99 | /// </summary> | 99 | /// </summary> |
100 | /// <param name="key">UUID of the client</param> | ||
101 | /// <param name="key2">Remote endpoint of the client</param> | ||
102 | /// <param name="value">Reference to the client object</param> | 100 | /// <param name="value">Reference to the client object</param> |
103 | /// <returns>True if the client reference was successfully added, | 101 | /// <returns>True if the client reference was successfully added, |
104 | /// otherwise false if the given key already existed in the collection</returns> | 102 | /// otherwise false if the given key already existed in the collection</returns> |
105 | public bool Add(UUID key, IPEndPoint key2, IClientAPI value) | 103 | public bool Add(IClientAPI value) |
106 | { | 104 | { |
107 | lock (m_writeLock) | 105 | lock (m_writeLock) |
108 | { | 106 | { |
109 | if (!m_dict.ContainsKey(key) && !m_dict2.ContainsKey(key2)) | 107 | if (!m_dict.ContainsKey(value.AgentId) && !m_dict2.ContainsKey(value.RemoteEndPoint)) |
110 | { | 108 | { |
111 | m_dict = m_dict.Add(key, value); | 109 | m_dict = m_dict.Add(value.AgentId, value); |
112 | m_dict2 = m_dict2.Add(key2, value); | 110 | m_dict2 = m_dict2.Add(value.RemoteEndPoint, value); |
113 | 111 | ||
114 | return true; | 112 | return true; |
115 | } | 113 | } |
@@ -123,14 +121,16 @@ namespace OpenSim.Framework | |||
123 | /// <summary> | 121 | /// <summary> |
124 | /// Remove a client from the collection | 122 | /// Remove a client from the collection |
125 | /// </summary> | 123 | /// </summary> |
126 | /// <param name="key">UUID of the client</param> | 124 | /// <param name="value">Reference to the client object</param> |
127 | /// <param name="key2">Remote endpoint of the client</param> | 125 | public void Remove(IClientAPI value) |
128 | public void Remove(UUID key, IPEndPoint key2) | ||
129 | { | 126 | { |
130 | lock (m_writeLock) | 127 | lock (m_writeLock) |
131 | { | 128 | { |
132 | m_dict = m_dict.Delete(key); | 129 | if (m_dict.ContainsKey(value.AgentId)) |
133 | m_dict2 = m_dict2.Delete(key2); | 130 | m_dict = m_dict.Delete(value.AgentId); |
131 | |||
132 | if (m_dict2.ContainsKey(value.RemoteEndPoint)) | ||
133 | m_dict2 = m_dict2.Delete(value.RemoteEndPoint); | ||
134 | } | 134 | } |
135 | } | 135 | } |
136 | 136 | ||
diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 99ea0d5..29846f5 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs | |||
@@ -561,6 +561,8 @@ namespace OpenSim.Framework | |||
561 | // [Obsolete("LLClientView Specific - Circuits are unique to LLClientView")] | 561 | // [Obsolete("LLClientView Specific - Circuits are unique to LLClientView")] |
562 | uint CircuitCode { get; } | 562 | uint CircuitCode { get; } |
563 | 563 | ||
564 | IPEndPoint RemoteEndPoint { get; } | ||
565 | |||
564 | event GenericMessage OnGenericMessage; | 566 | event GenericMessage OnGenericMessage; |
565 | 567 | ||
566 | // [Obsolete("LLClientView Specific - Replace with more bare-bones arguments.")] | 568 | // [Obsolete("LLClientView Specific - Replace with more bare-bones arguments.")] |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 86d0112..aecb362 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -411,38 +411,34 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
411 | "[CLIENT]: Close has been called for {0} attached to scene {1}", | 411 | "[CLIENT]: Close has been called for {0} attached to scene {1}", |
412 | Name, m_scene.RegionInfo.RegionName); | 412 | Name, m_scene.RegionInfo.RegionName); |
413 | 413 | ||
414 | // Remove ourselves from the scene | 414 | // Send the STOP packet |
415 | m_scene.ClientManager.Remove(m_agentId, m_udpClient.RemoteEndPoint); | 415 | DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator); |
416 | OutPacket(disable, ThrottleOutPacketType.Unknown); | ||
417 | |||
418 | IsActive = false; | ||
416 | 419 | ||
420 | // Shutdown the image manager | ||
417 | if (m_imageManager != null) | 421 | if (m_imageManager != null) |
418 | { | ||
419 | m_imageManager.Close(); | 422 | m_imageManager.Close(); |
420 | m_imageManager = null; | ||
421 | } | ||
422 | |||
423 | if (m_udpServer != null) | ||
424 | { | ||
425 | m_udpServer.Flush(); | ||
426 | } | ||
427 | 423 | ||
424 | // Fire the callback for this connection closing | ||
428 | if (OnConnectionClosed != null) | 425 | if (OnConnectionClosed != null) |
429 | OnConnectionClosed(this); | 426 | OnConnectionClosed(this); |
430 | 427 | ||
431 | CloseCleanup(); | 428 | // Flush all of the packets out of the UDP server for this client |
432 | } | 429 | if (m_udpServer != null) |
430 | m_udpServer.Flush(m_udpClient); | ||
433 | 431 | ||
434 | private void CloseCleanup() | 432 | // Remove ourselves from the scene |
435 | { | ||
436 | m_scene.RemoveClient(AgentId); | 433 | m_scene.RemoveClient(AgentId); |
434 | m_scene.ClientManager.Remove(this); | ||
437 | 435 | ||
438 | //m_log.InfoFormat("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false)); | 436 | //m_log.InfoFormat("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false)); |
437 | //GC.Collect(); | ||
439 | //m_log.InfoFormat("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true)); | 438 | //m_log.InfoFormat("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true)); |
440 | 439 | ||
441 | // Send the STOP packet | 440 | // FIXME: Is this still necessary? |
442 | DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator); | 441 | //Thread.Sleep(2000); |
443 | OutPacket(disable, ThrottleOutPacketType.Unknown); | ||
444 | |||
445 | Thread.Sleep(2000); | ||
446 | 442 | ||
447 | // Shut down timers. Thread Context of this method is murky. Lock all timers | 443 | // Shut down timers. Thread Context of this method is murky. Lock all timers |
448 | if (m_avatarTerseUpdateTimer.Enabled) | 444 | if (m_avatarTerseUpdateTimer.Enabled) |
@@ -459,8 +455,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
459 | // We need to do this over grid communications | 455 | // We need to do this over grid communications |
460 | //m_scene.CloseAllAgents(CircuitCode); | 456 | //m_scene.CloseAllAgents(CircuitCode); |
461 | 457 | ||
462 | IsActive = false; | ||
463 | |||
464 | m_avatarTerseUpdateTimer.Dispose(); | 458 | m_avatarTerseUpdateTimer.Dispose(); |
465 | m_primTerseUpdateTimer.Dispose(); | 459 | m_primTerseUpdateTimer.Dispose(); |
466 | m_primFullUpdateTimer.Dispose(); | 460 | m_primFullUpdateTimer.Dispose(); |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs index 343f537..8469ba6 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLImageManager.cs | |||
@@ -167,39 +167,39 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
167 | J2KImage imagereq; | 167 | J2KImage imagereq; |
168 | int numCollected = 0; | 168 | int numCollected = 0; |
169 | 169 | ||
170 | //lock (m_syncRoot) | 170 | m_lastloopprocessed = DateTime.Now.Ticks; |
171 | //{ | 171 | |
172 | m_lastloopprocessed = DateTime.Now.Ticks; | 172 | // This can happen during Close() |
173 | 173 | if (m_client == null) | |
174 | // This can happen during Close() | 174 | return false; |
175 | if (m_client == null) | 175 | |
176 | return false; | 176 | while ((imagereq = GetHighestPriorityImage()) != null) |
177 | 177 | { | |
178 | while ((imagereq = GetHighestPriorityImage()) != null) | 178 | if (imagereq.IsDecoded == true) |
179 | { | 179 | { |
180 | if (imagereq.IsDecoded == true) | 180 | ++numCollected; |
181 | { | ||
182 | ++numCollected; | ||
183 | 181 | ||
184 | if (imagereq.SendPackets(m_client, maxpack)) | 182 | if (imagereq.SendPackets(m_client, maxpack)) |
185 | { | 183 | { |
186 | // Send complete. Destroy any knowledge of this transfer | 184 | // Send complete. Destroy any knowledge of this transfer |
187 | RemoveImageFromQueue(imagereq); | 185 | RemoveImageFromQueue(imagereq); |
188 | } | ||
189 | } | 186 | } |
190 | |||
191 | if (numCollected == count) | ||
192 | break; | ||
193 | } | 187 | } |
194 | //} | 188 | |
189 | if (numCollected == count) | ||
190 | break; | ||
191 | } | ||
195 | 192 | ||
196 | return m_priorityQueue.Count > 0; | 193 | return m_priorityQueue.Count > 0; |
197 | } | 194 | } |
198 | 195 | ||
199 | //Faux destructor | 196 | /// <summary> |
197 | /// Faux destructor | ||
198 | /// </summary> | ||
200 | public void Close() | 199 | public void Close() |
201 | { | 200 | { |
202 | m_shuttingdown = true; | 201 | m_shuttingdown = true; |
202 | m_priorityQueue = null; | ||
203 | m_j2kDecodeModule = null; | 203 | m_j2kDecodeModule = null; |
204 | m_assetCache = null; | 204 | m_assetCache = null; |
205 | m_client = null; | 205 | m_client = null; |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 8ec143a..22c275c 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -390,7 +390,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
390 | } | 390 | } |
391 | } | 391 | } |
392 | 392 | ||
393 | public void Flush() | 393 | public void Flush(LLUDPClient udpClient) |
394 | { | 394 | { |
395 | // FIXME: Implement? | 395 | // FIXME: Implement? |
396 | } | 396 | } |
@@ -645,15 +645,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
645 | client.OnLogout += LogoutHandler; | 645 | client.OnLogout += LogoutHandler; |
646 | client.OnConnectionClosed += ConnectionClosedHandler; | 646 | client.OnConnectionClosed += ConnectionClosedHandler; |
647 | 647 | ||
648 | m_scene.ClientManager.Add(agentID, remoteEndPoint, client); | ||
649 | |||
650 | // Start the IClientAPI | 648 | // Start the IClientAPI |
651 | m_scene.ClientManager.Add(agentID, remoteEndPoint, client); | 649 | m_scene.ClientManager.Add(client); |
652 | client.Start(); | 650 | client.Start(); |
653 | } | 651 | } |
654 | else | 652 | else |
655 | { | 653 | { |
656 | m_log.Debug("[LLUDPSERVER]: Ignoring a repeated UseCircuitCode from " + udpClient.AgentID); | 654 | m_log.WarnFormat("[LLUDPSERVER]: Ignoring a repeated UseCircuitCode from {0} at {1} for circuit {2}", |
655 | udpClient.AgentID, remoteEndPoint, circuitCode); | ||
657 | } | 656 | } |
658 | } | 657 | } |
659 | 658 | ||