diff options
author | Justin Clark-Casey (justincc) | 2012-07-05 23:15:59 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-07-05 23:15:59 +0100 |
commit | 7e73f609e5f61040358ec247d371306165945ca1 (patch) | |
tree | 93f38bac65a2021a1438f4f47eb07cbebae0c99c /OpenSim/Framework | |
parent | minor: add client name to various login service log messages to disambiguate ... (diff) | |
download | opensim-SC-7e73f609e5f61040358ec247d371306165945ca1.zip opensim-SC-7e73f609e5f61040358ec247d371306165945ca1.tar.gz opensim-SC-7e73f609e5f61040358ec247d371306165945ca1.tar.bz2 opensim-SC-7e73f609e5f61040358ec247d371306165945ca1.tar.xz |
Log warning if time between invocations of the watchdog thread is twice the timer setting.
This is to help detect situations where thread timeout warnings are being generated because of general machine issues rather than deadlock, network or other problems.
Diffstat (limited to 'OpenSim/Framework')
-rw-r--r-- | OpenSim/Framework/Watchdog.cs | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/OpenSim/Framework/Watchdog.cs b/OpenSim/Framework/Watchdog.cs index 2b3a719..8a74f53 100644 --- a/OpenSim/Framework/Watchdog.cs +++ b/OpenSim/Framework/Watchdog.cs | |||
@@ -101,12 +101,24 @@ namespace OpenSim.Framework | |||
101 | private static Dictionary<int, ThreadWatchdogInfo> m_threads; | 101 | private static Dictionary<int, ThreadWatchdogInfo> m_threads; |
102 | private static System.Timers.Timer m_watchdogTimer; | 102 | private static System.Timers.Timer m_watchdogTimer; |
103 | 103 | ||
104 | /// <summary> | ||
105 | /// Last time the watchdog thread ran. | ||
106 | /// </summary> | ||
107 | /// <remarks> | ||
108 | /// Should run every WATCHDOG_INTERVAL_MS | ||
109 | /// </remarks> | ||
110 | public static int LastWatchdogThreadTick { get; private set; } | ||
111 | |||
104 | static Watchdog() | 112 | static Watchdog() |
105 | { | 113 | { |
106 | m_threads = new Dictionary<int, ThreadWatchdogInfo>(); | 114 | m_threads = new Dictionary<int, ThreadWatchdogInfo>(); |
107 | m_watchdogTimer = new System.Timers.Timer(WATCHDOG_INTERVAL_MS); | 115 | m_watchdogTimer = new System.Timers.Timer(WATCHDOG_INTERVAL_MS); |
108 | m_watchdogTimer.AutoReset = false; | 116 | m_watchdogTimer.AutoReset = false; |
109 | m_watchdogTimer.Elapsed += WatchdogTimerElapsed; | 117 | m_watchdogTimer.Elapsed += WatchdogTimerElapsed; |
118 | |||
119 | // Set now so we don't get alerted on the first run | ||
120 | LastWatchdogThreadTick = Environment.TickCount & Int32.MaxValue; | ||
121 | |||
110 | m_watchdogTimer.Start(); | 122 | m_watchdogTimer.Start(); |
111 | } | 123 | } |
112 | 124 | ||
@@ -264,6 +276,16 @@ namespace OpenSim.Framework | |||
264 | /// <param name="e"></param> | 276 | /// <param name="e"></param> |
265 | private static void WatchdogTimerElapsed(object sender, System.Timers.ElapsedEventArgs e) | 277 | private static void WatchdogTimerElapsed(object sender, System.Timers.ElapsedEventArgs e) |
266 | { | 278 | { |
279 | int now = Environment.TickCount & Int32.MaxValue; | ||
280 | int msElapsed = now - LastWatchdogThreadTick; | ||
281 | |||
282 | if (msElapsed > WATCHDOG_INTERVAL_MS * 2) | ||
283 | m_log.WarnFormat( | ||
284 | "[WATCHDOG]: {0} ms since Watchdog last ran. Interval should be approximately {1} ms", | ||
285 | msElapsed, WATCHDOG_INTERVAL_MS); | ||
286 | |||
287 | LastWatchdogThreadTick = Environment.TickCount & Int32.MaxValue; | ||
288 | |||
267 | Action<ThreadWatchdogInfo> callback = OnWatchdogTimeout; | 289 | Action<ThreadWatchdogInfo> callback = OnWatchdogTimeout; |
268 | 290 | ||
269 | if (callback != null) | 291 | if (callback != null) |
@@ -272,8 +294,6 @@ namespace OpenSim.Framework | |||
272 | 294 | ||
273 | lock (m_threads) | 295 | lock (m_threads) |
274 | { | 296 | { |
275 | int now = Environment.TickCount & Int32.MaxValue; | ||
276 | |||
277 | foreach (ThreadWatchdogInfo threadInfo in m_threads.Values) | 297 | foreach (ThreadWatchdogInfo threadInfo in m_threads.Values) |
278 | { | 298 | { |
279 | if (threadInfo.Thread.ThreadState == ThreadState.Stopped) | 299 | if (threadInfo.Thread.ThreadState == ThreadState.Stopped) |