public virtual List <UnifiedBlockingObject> GetUnmanagedBlockingObjects(uint osThreadId)
{
var result = new List <UnifiedBlockingObject>();
if (_unifiedStackTraces != null && _stackWalker != null)
{
var threadInfo = _unifiedStackTraces.Threads.SingleOrDefault(ti => ti.OSThreadId == osThreadId);
if (threadInfo != null)
{
var stack = _unifiedStackTraces.GetStackTrace(threadInfo.EngineThreadId);
foreach (var frame in stack)
{
_stackWalker.SetFrameParameters(frame);
UnifiedBlockingObject blockingObject;
if (_stackWalker.GetCriticalSectionBlockingObject(frame, out blockingObject))
{
result.Add(blockingObject);
}
else if (_stackWalker.GetThreadSleepBlockingObject(frame, out blockingObject))
{
result.Add(blockingObject);
}
result.AddRange(frame.Handles.Select(GetUnifiedBlockingObjectForHandle));
}
}
}
return(result);
}