private List <ClrThread> CreateThreadList() { IThreadStoreData threadStore = GetThreadStoreData(); ulong finalizer = ulong.MaxValue - 1; if (threadStore != null) { finalizer = threadStore.Finalizer; } List <ClrThread> threads = new List <ClrThread>(); ulong addr = GetFirstThread(); IThreadData thread = GetThread(addr); // Ensure we don't hit an infinite loop HashSet <ulong> seen = new HashSet <ulong> { addr }; while (thread != null) { threads.Add(new DesktopThread(this, thread, addr, addr == finalizer)); addr = thread.Next; if (seen.Contains(addr) || addr == 0) { break; } seen.Add(addr); thread = GetThread(addr); } return(threads); }
private void InitThreads() { if (_threads == null) { IThreadStoreData threadStore = GetThreadStoreData(); ulong finalizer = ulong.MaxValue - 1; if (threadStore != null) { finalizer = threadStore.Finalizer; } List <ClrThread> threads = new List <ClrThread>(); // Give a max number of threads to walk to ensure no infinite loops due to data // inconsistency. int max = 4098; ulong addr = GetFirstThread(); IThreadData thread = GetThread(addr); while (max-- > 0 && thread != null) { threads.Add(new DesktopThread(this, thread, addr, addr == finalizer)); addr = thread.Next; thread = GetThread(addr); } _threads = threads; } }
internal override ulong GetFirstThread() { IThreadStoreData tsData = GetThreadStoreData(); if (tsData == null) { return(0); } return(tsData.FirstThread); }
private void InitThreads() { IThreadStoreData tsData = GetThreadStoreData(); List <ClrThread> threads = new List <ClrThread>(tsData.Count); ulong addr = tsData.FirstThread; IThreadData thread = GetThread(tsData.FirstThread); for (int i = 0; thread != null; i++) { threads.Add(new NativeThread(this, thread, addr, tsData.Finalizer == addr)); addr = thread.Next; thread = GetThread(addr); } _threads = threads.ToArray(); }
internal override ulong GetFirstThread() { IThreadStoreData threadStore = GetThreadStoreData(); return(threadStore != null ? threadStore.FirstThread : 0); }