From b6b1e9e214c31d27ec871fe3134cc4f62df285fe Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Sat, 6 Sep 2008 04:21:36 +0000 Subject: [PATCH] Mantis #624 Thank you, openlifegrid, for a patch to move new user connections to thread pool threads. Reworked by me to fit current trunk. I believe that that patch may be beneficial in reducing the cases in which regions become unresponsive and will no longer accept new logins. --- .../ClientStack/LindenUDP/LLUDPServer.cs | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index 8dec185a5e..c01f6d6715 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs @@ -30,6 +30,7 @@ using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; +using System.Threading; using System.Reflection; using libsecondlife.Packets; using log4net; @@ -69,6 +70,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP protected AssetCache m_assetCache; protected AgentCircuitManager m_authenticateSessionsClass; + protected Queue CreateUserPacket = new Queue(); + public LLPacketServer PacketServer { get { return m_packetServer; } @@ -236,7 +239,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP { // new client m_log.Debug("[UDPSERVER]: Adding New Client"); - AddNewClient(packet); UseCircuitCodePacket p = (UseCircuitCodePacket)packet; @@ -248,6 +250,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP ack_it.Packets[0].ID = packet.Header.Sequence; ack_it.Header.Reliable = false; SendPacketTo(ack_it.ToBytes(),ack_it.ToBytes().Length,SocketFlags.None,p.CircuitCode.Code); + + // toss it to a worker thread so IOthread can go home + lock (CreateUserPacket) + { + CreateUserPacket.Enqueue(packet); + } + WaitCallback createUserCallback = new WaitCallback(AddNewClient); + ThreadPool.QueueUserWorkItem(createUserCallback); } } catch (Exception e) @@ -311,6 +321,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } + /// + /// target of workerthread delegate to create a new user. + /// It assumes we get fired for each new user packet that comes in. + /// + /// + protected void AddNewClient(object o) + { + Packet packet; + lock (CreateUserPacket) + { + packet = CreateUserPacket.Dequeue(); + } + if (null != packet) + AddNewClient(packet); + } + protected virtual void AddNewClient(Packet packet) { //Slave regions don't accept new clients