Beispiel #1
0
        /// <summary>
        /// Gets the segment for the given object.
        /// </summary>
        /// <param name="obj">The object in question.</param>
        /// <param name="seg">The resulting segment.</param>
        /// <returns>True if obj lies within a gc segment, false otherwise.</returns>
        protected bool GetSegment(ulong obj, out HeapHashSegment seg)
        {
            if (obj != 0)
            {
                int lower = 0;
                int upper = _segments.Length - 1;

                while (lower <= upper)
                {
                    int mid = (lower + upper) >> 1;

                    if (obj < _segments[mid].StartAddress)
                    {
                        upper = mid - 1;
                    }
                    else if (obj >= _segments[mid].EndAddress)
                    {
                        lower = mid + 1;
                    }
                    else
                    {
                        seg = _segments[mid];
                        return(true);
                    }
                }
            }

            seg = new HeapHashSegment();
            return(false);
        }
Beispiel #2
0
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="heap">A ClrHeap to add objects from.</param>
        public ObjectSet(ClrHeap heap)
        {
            _heap       = heap;
            _minObjSize = heap.PointerSize * 3;

            _segments = new HeapHashSegment[_heap.Segments.Count];

            for (int i = 0; i < _segments.Length; i++)
            {
                ulong start = _heap.Segments[i].Start;
                ulong end   = _heap.Segments[i].End;
                _segments[i] = new HeapHashSegment
                {
                    StartAddress = start,
                    EndAddress   = end,
                    Objects      = new BitArray(checked ((int)(end - start) / _minObjSize), false)
                };
            }
        }
Beispiel #3
0
 /// <summary>
 /// Calculates the offset of an object within a segment.
 /// </summary>
 /// <param name="obj">The object</param>
 /// <param name="seg">The segment</param>
 /// <returns>The index into seg.Objects.</returns>
 protected int GetOffset(ulong obj, HeapHashSegment seg)
 {
     return(checked ((int)(obj - seg.StartAddress) / _minObjSize));
 }