/// <summary> /// Converts the specified blocking object. /// </summary> /// <param name="blockingObject">The blocking object.</param> /// <returns>IBlockingObject.</returns> public IBlockingObject Convert(ClrMd.BlockingObject blockingObject) { if (blockingObject == null) { return(null); } var item = new BlockingObjectAdapter(this, blockingObject); return(Cache.GetOrAdd <IBlockingObject>(blockingObject, () => item, () => item.Setup())); }
public BlockingObjectInformation(ClrDump clrDump, BlockingObject blockingObject) { ClrDump = clrDump; BlockingObject = blockingObject; if (blockingObject.HasSingleOwner && blockingObject.Owner != null) { OwnersId = new HashSet<int>(); OwnersId.Add(blockingObject.Owner.ManagedThreadId); } else { OwnersId = new HashSet<int>(blockingObject.Owners.Where(thread => thread != null).Select(thread => thread.ManagedThreadId)); } if (blockingObject.Waiters != null) { WaitersId = new HashSet<int>(blockingObject.Waiters.Where(thread => thread != null).Select(thread => thread.ManagedThreadId)); } else { WaitersId = new HashSet<int>(); } }
public UnifiedBlockingObject(BlockingObject obj) : this(BlockingObjectOrigin.ClrMD) { foreach (var owner in obj.Owners?.Where(o => o != null) ?? new ClrThread[0]) { OwnerOSThreadIds.Add(owner.OSThreadId); } foreach (var waiter in obj.Waiters?.Where(w => w != null) ?? new ClrThread[0]) { WaiterOSThreadIds.Add(waiter.OSThreadId); } Reason = (UnifiedBlockingReason)((int)obj.Reason); RecursionCount = obj.RecursionCount; ManagedObjectAddress = obj.Object; Type = UnifiedBlockingType.ClrBlockingObject; }
internal void SetBlockingObjects(BlockingObject[] blobjs) { _blockingObjs = blobjs; }