From 7102ac77698f4bfd7406d6e8871db7b006c2cae2 Mon Sep 17 00:00:00 2001 From: Tedd Hansen Date: Thu, 21 Feb 2008 10:43:24 +0000 Subject: "threads" command now works. I've added manual tracking of threads (only if compiled in DEBUG mode)... Its ugly and even requires a separate thread to track the treads, but it will be very valuable in debugging. --- .../Framework/Communications/Cache/AssetCache.cs | 1 + .../Communications/Cache/AssetServerBase.cs | 1 + OpenSim/Framework/Servers/BaseHttpServer.cs | 1 + OpenSim/Framework/ThreadTracker.cs | 106 +++++++++++++++++++++ 4 files changed, 109 insertions(+) create mode 100644 OpenSim/Framework/ThreadTracker.cs (limited to 'OpenSim/Framework') diff --git a/OpenSim/Framework/Communications/Cache/AssetCache.cs b/OpenSim/Framework/Communications/Cache/AssetCache.cs index 8f8e362..15b52b0 100644 --- a/OpenSim/Framework/Communications/Cache/AssetCache.cs +++ b/OpenSim/Framework/Communications/Cache/AssetCache.cs @@ -171,6 +171,7 @@ namespace OpenSim.Framework.Communications.Cache m_assetCacheThread.Name = "AssetCacheThread"; m_assetCacheThread.IsBackground = true; m_assetCacheThread.Start(); + OpenSim.Framework.ThreadTracker.Add(m_assetCacheThread); } /// diff --git a/OpenSim/Framework/Communications/Cache/AssetServerBase.cs b/OpenSim/Framework/Communications/Cache/AssetServerBase.cs index a3530bd..cae4231 100644 --- a/OpenSim/Framework/Communications/Cache/AssetServerBase.cs +++ b/OpenSim/Framework/Communications/Cache/AssetServerBase.cs @@ -101,6 +101,7 @@ namespace OpenSim.Framework.Communications.Cache m_localAssetServerThread.Name = "LocalAssetServerThread"; m_localAssetServerThread.IsBackground = true; m_localAssetServerThread.Start(); + OpenSim.Framework.ThreadTracker.Add(m_localAssetServerThread); } private void RunRequests() diff --git a/OpenSim/Framework/Servers/BaseHttpServer.cs b/OpenSim/Framework/Servers/BaseHttpServer.cs index 662eefd..dc540f9 100644 --- a/OpenSim/Framework/Servers/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/BaseHttpServer.cs @@ -550,6 +550,7 @@ namespace OpenSim.Framework.Servers m_workerThread.Name = "HttpThread"; m_workerThread.IsBackground = true; m_workerThread.Start(); + OpenSim.Framework.ThreadTracker.Add(m_workerThread); } private void StartHTTP() diff --git a/OpenSim/Framework/ThreadTracker.cs b/OpenSim/Framework/ThreadTracker.cs new file mode 100644 index 0000000..42e3879 --- /dev/null +++ b/OpenSim/Framework/ThreadTracker.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace OpenSim.Framework +{ + public static class ThreadTracker + { + public static List m_Threads; + public static System.Threading.Thread ThreadTrackerThread; + private static readonly long ThreadTimeout = 30 * 10000000; + + static ThreadTracker() + { +#if DEBUG + m_Threads = new List(); + ThreadTrackerThread = new Thread(ThreadTrackerThreadLoop); + ThreadTrackerThread.Name = "ThreadTrackerThread"; + ThreadTrackerThread.IsBackground = true; + ThreadTrackerThread.Priority = System.Threading.ThreadPriority.BelowNormal; + ThreadTrackerThread.Start(); +#endif + } + + private static void ThreadTrackerThreadLoop() + { + while (true) + { + Thread.Sleep(5000); + CleanUp(); + } + } + + public static void Add(System.Threading.Thread thread) + { +#if DEBUG + lock (m_Threads) + { + ThreadTrackerItem tti = new ThreadTrackerItem(); + tti.Thread = thread; + tti.LastSeenActive = DateTime.Now.Ticks; + m_Threads.Add(tti); + } +#endif + } + + public static void Remove(System.Threading.Thread thread) + { +#if DEBUG + lock (m_Threads) + { + foreach (ThreadTrackerItem tti in new ArrayList(m_Threads)) + { + if (tti.Thread == thread) + m_Threads.Remove(tti); + } + } +#endif + } + + public static void CleanUp() + { + lock (m_Threads) + { + foreach (ThreadTrackerItem tti in new ArrayList(m_Threads)) + { + if (tti.Thread.IsAlive) + { + // Its active + tti.LastSeenActive = DateTime.Now.Ticks; + } + else + { + // Its not active -- if its expired then remove it + if (tti.LastSeenActive + ThreadTimeout < DateTime.Now.Ticks) + m_Threads.Remove(tti); + } + } + } + } + + public static List GetThreads() + { + if (m_Threads == null) + return null; + + List threads = new List(); + lock (m_Threads) + { + foreach (ThreadTrackerItem tti in new ArrayList(m_Threads)) + { + threads.Add(tti.Thread); + } + } + return threads; + } + + public class ThreadTrackerItem + { + public System.Threading.Thread Thread; + public long LastSeenActive; + } + } +} -- cgit v1.1