Пример #1
0
        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);
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
        internal override ulong GetFirstThread()
        {
            IThreadStoreData tsData = GetThreadStoreData();

            if (tsData == null)
            {
                return(0);
            }
            return(tsData.FirstThread);
        }
Пример #4
0
        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();
        }
Пример #5
0
        internal override ulong GetFirstThread()
        {
            IThreadStoreData threadStore = GetThreadStoreData();

            return(threadStore != null ? threadStore.FirstThread : 0);
        }