private IEnumerable <ClrHandle> EnumerateHandleWorker() { Debug.Assert(_handles == null); List <ClrHandle> result = new List <ClrHandle>(); using (SOSHandleEnum handleEnum = _sos.EnumerateHandles()) { HandleData[] handles = new HandleData[8]; int fetched = 0; while ((fetched = handleEnum.ReadHandles(handles)) != 0) { for (int i = 0; i < fetched; i++) { ClrHandle handle = new ClrHandle(this, Heap, handles[i]); result.Add(handle); yield return(handle); handle = handle.GetInteriorHandle(); if (handle != null) { result.Add(handle); yield return(handle); } } } } _handles = result; }
internal override Dictionary <ulong, List <ulong> > GetDependentHandleMap(CancellationToken cancelToken) { Dictionary <ulong, List <ulong> > result = new Dictionary <ulong, List <ulong> >(); using (SOSHandleEnum handleEnum = _sos.EnumerateHandles()) { if (handleEnum == null) { return(result); } HandleData[] handles = new HandleData[32]; int fetched; while ((fetched = handleEnum.ReadHandles(handles)) != 0) { for (int i = 0; i < fetched; i++) { cancelToken.ThrowIfCancellationRequested(); HandleType type = (HandleType)handles[i].Type; if (type != HandleType.Dependent) { continue; } if (ReadPointer(handles[i].Handle, out ulong address)) { if (!result.TryGetValue(address, out List <ulong> value)) { result[address] = value = new List <ulong>(); } value.Add(handles[i].Secondary); } } } return(result); } }