diff options
Diffstat (limited to '')
-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 e091ea0..449d014 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; | ||
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) |