public SegmentCrawlStatus Sum(SegmentCrawlStatus other) { return(new SegmentCrawlStatus( ObjectCount + other.ObjectCount, ObjectLinkCount + other.ObjectLinkCount, CrawledChunks + other.CrawledChunks, OriginalFreeChunks + other.OriginalFreeChunks, ResultFreeChunks + other.ResultFreeChunks, FreePayloadSize + other.FreePayloadSize, UsedPayloadSize + other.UsedPayloadSize )); }
/// <summary> /// Analyzes all segments scanning for free spaces. Returns number of uncovered free bytes. /// This is a full-blocking long operation that may take around 8 seconds on a 64Gb heaps in non-parallel mode /// </summary> public SegmentCrawlStatus Crawl(bool parallel) { SegmentCrawlStatus total = new SegmentCrawlStatus(); var segs = m_Segments.Where(s => s!=null); if (parallel) { var lck = new object(); Parallel.ForEach(segs, (seg) => { if (!getWriteLock(seg)) return; try { var status = seg.Crawl(); lock(lck){ total = total.Sum(status);} } finally { releaseWriteLock(seg); } }); } else foreach(var seg in segs) { if (!getWriteLock(seg)) return total; try { total = total.Sum(seg.Crawl()); } finally { releaseWriteLock(seg); } } return total; }
public SegmentCrawlStatus Sum(SegmentCrawlStatus other) { return new SegmentCrawlStatus( CrawledChunks + other.CrawledChunks , OriginalFreeChunks + other.OriginalFreeChunks , ResultFreeChunks + other.ResultFreeChunks , FreePayloadSize + other.FreePayloadSize , UsedPayloadSize + other.UsedPayloadSize ); }