mirror of
https://github.com/opensim/opensim.git
synced 2026-08-04 16:22:50 +08:00
"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.
This commit is contained in:
106
OpenSim/Framework/ThreadTracker.cs
Normal file
106
OpenSim/Framework/ThreadTracker.cs
Normal file
@@ -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<ThreadTrackerItem> m_Threads;
|
||||
public static System.Threading.Thread ThreadTrackerThread;
|
||||
private static readonly long ThreadTimeout = 30 * 10000000;
|
||||
|
||||
static ThreadTracker()
|
||||
{
|
||||
#if DEBUG
|
||||
m_Threads = new List<ThreadTrackerItem>();
|
||||
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<Thread> GetThreads()
|
||||
{
|
||||
if (m_Threads == null)
|
||||
return null;
|
||||
|
||||
List<Thread> threads = new List<Thread>();
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user