From fcc665a56725eaa1e92b096fdbd0190d7a20b2ec Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Tue, 5 Aug 2014 01:15:07 +0100 Subject: Put pCampbot "disconnect" command on separate thread like "connect" so that we can continue to run status commands whilst bots are disconnecting. --- OpenSim/Tools/pCampBot/BotManager.cs | 62 ++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 27 deletions(-) (limited to 'OpenSim/Tools/pCampBot') diff --git a/OpenSim/Tools/pCampBot/BotManager.cs b/OpenSim/Tools/pCampBot/BotManager.cs index f54d586..a872dbc 100644 --- a/OpenSim/Tools/pCampBot/BotManager.cs +++ b/OpenSim/Tools/pCampBot/BotManager.cs @@ -611,45 +611,53 @@ namespace pCampBot private void HandleDisconnect(string module, string[] cmd) { + List connectedBots; + int botsToDisconnectCount; + lock (m_bots) + connectedBots = m_bots.FindAll(b => b.ConnectionState == ConnectionState.Connected); + + if (cmd.Length == 1) { - int botsToDisconnect; - int connectedBots = m_bots.Count(b => b.ConnectionState == ConnectionState.Connected); + botsToDisconnectCount = connectedBots.Count; + } + else + { + if (!ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, cmd[1], out botsToDisconnectCount)) + return; - if (cmd.Length == 1) - { - botsToDisconnect = connectedBots; - } - else - { - if (!ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, cmd[1], out botsToDisconnect)) - return; + botsToDisconnectCount = Math.Min(botsToDisconnectCount, connectedBots.Count); + } - botsToDisconnect = Math.Min(botsToDisconnect, connectedBots); - } + Thread disconnectBotThread = new Thread(o => DisconnectBotsInternal(connectedBots, botsToDisconnectCount)); - DisconnectingBots = true; + disconnectBotThread.Name = "Bots disconnection thread"; + disconnectBotThread.Start(); + } - MainConsole.Instance.OutputFormat("Disconnecting {0} bots", botsToDisconnect); + private void DisconnectBotsInternal(List connectedBots, int disconnectCount) + { + DisconnectingBots = true; - int disconnectedBots = 0; + MainConsole.Instance.OutputFormat("Disconnecting {0} bots", disconnectCount); - for (int i = m_bots.Count - 1; i >= 0; i--) - { - if (disconnectedBots >= botsToDisconnect) - break; + int disconnectedBots = 0; - Bot thisBot = m_bots[i]; + for (int i = connectedBots.Count - 1; i >= 0; i--) + { + if (disconnectedBots >= disconnectCount) + break; - if (thisBot.ConnectionState == ConnectionState.Connected) - { - Util.FireAndForget(o => thisBot.Disconnect()); - disconnectedBots++; - } - } + Bot thisBot = connectedBots[i]; - DisconnectingBots = false; + if (thisBot.ConnectionState == ConnectionState.Connected) + { + thisBot.Disconnect(); + disconnectedBots++; + } } + + DisconnectingBots = false; } private void HandleSit(string module, string[] cmd) -- cgit v1.1