From 1f605da7618d4c38a76bfc87215a7b5e791bbb0a Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Thu, 5 Jun 2008 01:20:17 +0000 Subject: * If a client thread crashes, make an attempt to notify the client and clean up the resources --- .../Region/ClientStack/LindenUDP/LLClientView.cs | 62 ++++++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) (limited to 'OpenSim/Region/ClientStack') diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 172288a..1044d8f 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -734,9 +734,30 @@ namespace OpenSim.Region.ClientStack.LindenUDP StatsManager.SimExtraStats.AddAbnormalClientThreadTermination(); // Don't let a failure in an individual client thread crash the whole sim. - // FIXME: could do more sophisticated cleanup since leaving client resources around may - // cause instability for the region server over time. - m_log.ErrorFormat("[CLIENT]: Client thread for {0} {1} crashed. Exception {2}", Name, AgentId, e); + m_log.ErrorFormat("[CLIENT]: Client thread for {0} {1} crashed. Logging them out. Exception {2}", Name, AgentId, e); + + try + { + // Make an attempt to alert the user that their session has crashed + AgentAlertMessagePacket packet + = BuildAgentAlertPacket( + "Unfortunately the session for this client on the server has crashed.\n" + + "Any further actions taken will not be processed.\n" + + "Please relog", true); + + ProcessOutPacket(packet); + + // There may be a better way to do this. Perhaps kick? Not sure this propogates notifications to + // listeners yet, though. + Logout(this); + } + catch (Exception e2) + { + if (e2 is ThreadAbortException) + throw e2; + + m_log.ErrorFormat("[CLIENT]: Further exception thrown on forced session logout. {0}", e2); + } } } @@ -1808,11 +1829,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// the AlertMessage packet). public void SendAgentAlertMessage(string message, bool modal) { + OutPacket(BuildAgentAlertPacket(message, modal), ThrottleOutPacketType.Task); + } + + /// + /// Construct an agent alert packet + /// + /// + /// + /// + protected AgentAlertMessagePacket BuildAgentAlertPacket(string message, bool modal) + { AgentAlertMessagePacket alertPack = (AgentAlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage); alertPack.AgentData.AgentID = AgentId; alertPack.AlertData.Message = Helpers.StringToField(message); alertPack.AlertData.Modal = modal; - OutPacket(alertPack, ThrottleOutPacketType.Task); + + return alertPack; } public void SendLoadURL(string objectname, LLUUID objectID, LLUUID ownerID, bool groupOwned, string message, @@ -3265,8 +3298,28 @@ namespace OpenSim.Region.ClientStack.LindenUDP return LLUUID.Zero; } + /// + /// Handler called when we receive a logout packet. + /// + /// + /// + /// protected virtual bool Logout(IClientAPI client, Packet packet) { + return Logout(client); + } + + /// + /// + /// + /// + /// A + /// + /// + /// A + /// + protected virtual bool Logout(IClientAPI client) + { m_log.Info("[CLIENT]: Got a logout request"); handlerLogout = OnLogout; @@ -5007,6 +5060,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (handlerUpdateInventoryItem != null) { InventoryItemBase itemUpd = new InventoryItemBase(); + itemUpd = null; itemUpd.ID = update.InventoryData[i].ItemID; itemUpd.Name = Util.FieldToString(update.InventoryData[i].Name); itemUpd.Description = Util.FieldToString(update.InventoryData[i].Description); -- cgit v1.1