diff options
-rw-r--r-- | OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs b/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs index c621fd3..eb6634d 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs | |||
@@ -61,7 +61,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
61 | 61 | ||
62 | private static int _idk_ = 0; // core connector identifier | 62 | private static int _idk_ = 0; // core connector identifier |
63 | private static int _pdk_ = 0; // ping interval counter | 63 | private static int _pdk_ = 0; // ping interval counter |
64 | private static int _icc_ = 0; // IRC connect counter | 64 | private static int _icc_ = ICCD_PERIOD; // IRC connect counter |
65 | 65 | ||
66 | // List of configured connectors | 66 | // List of configured connectors |
67 | 67 | ||
@@ -71,6 +71,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
71 | 71 | ||
72 | private static System.Timers.Timer m_watchdog = null; | 72 | private static System.Timers.Timer m_watchdog = null; |
73 | 73 | ||
74 | // The watch-dog gets started as soon as the class is instantiated, and | ||
75 | // ticks once every second (WD_INTERVAL) | ||
76 | |||
74 | static IRCConnector() | 77 | static IRCConnector() |
75 | { | 78 | { |
76 | m_log.DebugFormat("[IRC-Connector]: Static initialization started"); | 79 | m_log.DebugFormat("[IRC-Connector]: Static initialization started"); |
@@ -234,10 +237,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
234 | m_nick = m_baseNick + Util.RandomClass.Next(1, 99); | 237 | m_nick = m_baseNick + Util.RandomClass.Next(1, 99); |
235 | } | 238 | } |
236 | 239 | ||
237 | // Add the newly created connector to the known connectors list | ||
238 | |||
239 | // m_connectors.Add(this); | ||
240 | |||
241 | m_log.InfoFormat("[IRC-Connector-{0}]: Initialization complete", idn); | 240 | m_log.InfoFormat("[IRC-Connector-{0}]: Initialization complete", idn); |
242 | 241 | ||
243 | } | 242 | } |
@@ -255,14 +254,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
255 | if (!m_enabled) | 254 | if (!m_enabled) |
256 | { | 255 | { |
257 | 256 | ||
258 | m_connectors.Add(this); | ||
259 | m_enabled = true; | ||
260 | |||
261 | if (!Connected) | 257 | if (!Connected) |
262 | { | 258 | { |
263 | Connect(); | 259 | Connect(); |
264 | } | 260 | } |
265 | 261 | ||
262 | lock(m_connectors) | ||
263 | m_connectors.Add(this); | ||
264 | |||
265 | m_enabled = true; | ||
266 | |||
266 | } | 267 | } |
267 | } | 268 | } |
268 | 269 | ||
@@ -305,7 +306,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
305 | 306 | ||
306 | } | 307 | } |
307 | 308 | ||
308 | m_connectors.Remove(this); | 309 | lock(m_connectors) |
310 | m_connectors.Remove(this); | ||
309 | 311 | ||
310 | } | 312 | } |
311 | } | 313 | } |
@@ -340,6 +342,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
340 | 342 | ||
341 | try | 343 | try |
342 | { | 344 | { |
345 | |||
343 | if (m_connected) return; | 346 | if (m_connected) return; |
344 | 347 | ||
345 | m_connected = true; | 348 | m_connected = true; |
@@ -376,8 +379,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
376 | { | 379 | { |
377 | m_log.ErrorFormat("[IRC-Connector-{0}] cannot connect {1} to {2}:{3}: {4}", | 380 | m_log.ErrorFormat("[IRC-Connector-{0}] cannot connect {1} to {2}:{3}: {4}", |
378 | idn, m_nick, m_server, m_port, e.Message); | 381 | idn, m_nick, m_server, m_port, e.Message); |
379 | m_connected = false; | 382 | // It might seem reasonable to reset connected and pending status here |
380 | m_pending = false; | 383 | // Seeing as we know that the login has failed, but if we do that, then |
384 | // connection will be retried each time the interconnection interval | ||
385 | // expires. By leaving them as they are, the connection will be retried | ||
386 | // when the login timeout expires. Which is preferred. | ||
381 | } | 387 | } |
382 | 388 | ||
383 | } | 389 | } |
@@ -834,14 +840,17 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
834 | protected static void WatchdogHandler(Object source, ElapsedEventArgs args) | 840 | protected static void WatchdogHandler(Object source, ElapsedEventArgs args) |
835 | { | 841 | { |
836 | 842 | ||
837 | // m_log.InfoFormat("[IRC-Watchdog] Status scan"); | 843 | // m_log.InfoFormat("[IRC-Watchdog] Status scan, pdk = {0}, icc = {1}", _pdk_, _icc_); |
838 | 844 | ||
839 | _pdk_ = (_pdk_+1)%PING_PERIOD; // cycle the ping trigger | 845 | _pdk_ = (_pdk_+1)%PING_PERIOD; // cycle the ping trigger |
840 | _icc_++; // increment the inter-consecutive-connect-delay counter | 846 | _icc_++; // increment the inter-consecutive-connect-delay counter |
841 | 847 | ||
848 | lock(m_connectors) | ||
842 | foreach (IRCConnector connector in m_connectors) | 849 | foreach (IRCConnector connector in m_connectors) |
843 | { | 850 | { |
851 | |||
844 | // m_log.InfoFormat("[IRC-Watchdog] Scanning {0}", connector); | 852 | // m_log.InfoFormat("[IRC-Watchdog] Scanning {0}", connector); |
853 | |||
845 | if (connector.Enabled) | 854 | if (connector.Enabled) |
846 | { | 855 | { |
847 | if (!connector.Connected) | 856 | if (!connector.Connected) |
@@ -863,14 +872,18 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
863 | { | 872 | { |
864 | if (connector.m_timeout == 0) | 873 | if (connector.m_timeout == 0) |
865 | { | 874 | { |
866 | // m_log.ErrorFormat("[IRC-Watchdog] Login timed-out for connector {0}, reconnecting", connector.idn); | 875 | m_log.ErrorFormat("[IRC-Watchdog] Login timed-out for connector {0}, reconnecting", connector.idn); |
867 | connector.Reconnect(); | 876 | connector.Reconnect(); |
868 | } | 877 | } |
869 | else | 878 | else |
870 | connector.m_timeout--; | 879 | connector.m_timeout--; |
871 | } | 880 | } |
872 | 881 | ||
873 | if (_pdk_ == 0) | 882 | // Being marked connected is not enough to ping. Socket establishment can sometimes take a long |
883 | // time, in which case the watch dog might try to ping the server before the socket has been | ||
884 | // set up, with nasty side-effects. | ||
885 | |||
886 | else if (_pdk_ == 0) | ||
874 | { | 887 | { |
875 | try | 888 | try |
876 | { | 889 | { |