aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
diff options
context:
space:
mode:
authorJohn Hurliman2009-10-13 14:50:03 -0700
committerJohn Hurliman2009-10-13 14:50:03 -0700
commit23a334b9f54a1ef5df3b503c165e7b76b746a2b1 (patch)
tree93003db47fcd77af4085c0c49cbc1f2f0293b5eb /OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
parent* Unregister event handlers in LLUDPServer when a client logs out and disconn... (diff)
downloadopensim-SC-23a334b9f54a1ef5df3b503c165e7b76b746a2b1.zip
opensim-SC-23a334b9f54a1ef5df3b503c165e7b76b746a2b1.tar.gz
opensim-SC-23a334b9f54a1ef5df3b503c165e7b76b746a2b1.tar.bz2
opensim-SC-23a334b9f54a1ef5df3b503c165e7b76b746a2b1.tar.xz
* Rewrote ClientManager to remove Lindenisms from OpenSim core, improve performance by removing locks, and replace LLUDPClientCollection
* Removed the confusing (and LL-specific) shutdowncircuit parameter from IClientAPI.Close() * Updated the LLUDP code to only use ClientManager instead of trying to synchronize ClientManager and m_clients * Remove clients asynchronously since it is a very slow operation (including a 2000ms sleep)
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs77
1 files changed, 23 insertions, 54 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index bc9cfcf..86d0112 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -403,39 +403,35 @@ namespace OpenSim.Region.ClientStack.LindenUDP
403 #region Client Methods 403 #region Client Methods
404 404
405 /// <summary> 405 /// <summary>
406 /// Close down the client view. This *must* be the last method called, since the last # 406 /// Shut down the client view
407 /// statement of CloseCleanup() aborts the thread.
408 /// </summary> 407 /// </summary>
409 /// <param name="shutdownCircuit"></param> 408 public void Close()
410 public void Close(bool shutdownCircuit)
411 { 409 {
412 m_log.DebugFormat( 410 m_log.DebugFormat(
413 "[CLIENT]: Close has been called with shutdownCircuit = {0} for {1} attached to scene {2}", 411 "[CLIENT]: Close has been called for {0} attached to scene {1}",
414 shutdownCircuit, Name, m_scene.RegionInfo.RegionName); 412 Name, m_scene.RegionInfo.RegionName);
413
414 // Remove ourselves from the scene
415 m_scene.ClientManager.Remove(m_agentId, m_udpClient.RemoteEndPoint);
415 416
416 if (m_imageManager != null) 417 if (m_imageManager != null)
418 {
417 m_imageManager.Close(); 419 m_imageManager.Close();
420 m_imageManager = null;
421 }
418 422
419 if (m_udpServer != null) 423 if (m_udpServer != null)
420 m_udpServer.Flush();
421
422 // raise an event on the packet server to Shutdown the circuit
423 // Now, if we raise the event then the packet server will call this method itself, so don't try cleanup
424 // here otherwise we'll end up calling it twice.
425 // FIXME: In truth, I might be wrong but this whole business of calling this method twice (with different args) looks
426 // horribly tangly. Hopefully it should be possible to greatly simplify it.
427 if (shutdownCircuit)
428 { 424 {
429 if (OnConnectionClosed != null) 425 m_udpServer.Flush();
430 OnConnectionClosed(this);
431 }
432 else
433 {
434 CloseCleanup(shutdownCircuit);
435 } 426 }
427
428 if (OnConnectionClosed != null)
429 OnConnectionClosed(this);
430
431 CloseCleanup();
436 } 432 }
437 433
438 private void CloseCleanup(bool shutdownCircuit) 434 private void CloseCleanup()
439 { 435 {
440 m_scene.RemoveClient(AgentId); 436 m_scene.RemoveClient(AgentId);
441 437
@@ -459,43 +455,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
459 lock (m_primFullUpdateTimer) 455 lock (m_primFullUpdateTimer)
460 m_primFullUpdateTimer.Stop(); 456 m_primFullUpdateTimer.Stop();
461 457
462 // This is just to give the client a reasonable chance of
463 // flushing out all it's packets. There should probably
464 // be a better mechanism here
465
466 // We can't reach into other scenes and close the connection 458 // We can't reach into other scenes and close the connection
467 // We need to do this over grid communications 459 // We need to do this over grid communications
468 //m_scene.CloseAllAgents(CircuitCode); 460 //m_scene.CloseAllAgents(CircuitCode);
469 461
470 // If we're not shutting down the circuit, then this is the last time we'll go here.
471 // If we are shutting down the circuit, the UDP Server will come back here with
472 // ShutDownCircuit = false
473 if (!(shutdownCircuit))
474 {
475 GC.Collect();
476 m_imageManager = null;
477 // Sends a KillPacket object, with which, the
478 // blockingqueue dequeues and sees it's a killpacket
479 // and terminates within the context of the client thread.
480 // This ensures that it's done from within the context
481 // of the client thread regardless of where Close() is called.
482 KillEndDone();
483 }
484
485 IsActive = false; 462 IsActive = false;
486 463
487 m_avatarTerseUpdateTimer.Close(); 464 m_avatarTerseUpdateTimer.Dispose();
488 m_primTerseUpdateTimer.Close(); 465 m_primTerseUpdateTimer.Dispose();
489 m_primFullUpdateTimer.Close(); 466 m_primFullUpdateTimer.Dispose();
490 467
491 //m_udpServer.OnPacketStats -= PopulateStats; 468 // Disable UDP handling for this client
492 m_udpClient.Shutdown(); 469 m_udpClient.Shutdown();
493
494 // wait for thread stoped
495 // m_clientThread.Join();
496
497 // delete circuit code
498 //m_networkServer.CloseClient(this);
499 } 470 }
500 471
501 public void Kick(string message) 472 public void Kick(string message)
@@ -10225,7 +10196,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
10225 10196
10226 public void KillEndDone() 10197 public void KillEndDone()
10227 { 10198 {
10228 m_udpClient.Shutdown();
10229 } 10199 }
10230 10200
10231 #region IClientCore 10201 #region IClientCore
@@ -10268,15 +10238,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
10268 { 10238 {
10269 Kick(reason); 10239 Kick(reason);
10270 Thread.Sleep(1000); 10240 Thread.Sleep(1000);
10271 Close(true); 10241 Close();
10272 } 10242 }
10273 10243
10274 public void Disconnect() 10244 public void Disconnect()
10275 { 10245 {
10276 Close(true); 10246 Close();
10277 } 10247 }
10278 10248
10279
10280 #endregion 10249 #endregion
10281 10250
10282 public void RefreshGroupMembership() 10251 public void RefreshGroupMembership()