private IEventTree[] MergeByRoots(IEnumerable <ISingleEventTree> source) { IGrouping <ulong, ISingleEventTree>[] groups = source.GroupBy(x => x.EventHash).ToArray(); IEventTree[] result = new IEventTree[groups.Length]; for (int i = 0; i < groups.Length; i++) { ISingleEventTree[] items = groups[i].ToArray(); uint beginLifetime = items.Min(x => x.BeginLifetime); uint endLifetime = items.Max(x => x.EndLifetime); List <byte[]> data = items.Select(x => x.GetBinaryData()).ToList(); byte[] mergedData = _agentLibrary.MergeEventTrees(data); MergedEventTree mergedEventTree = new MergedEventTree(beginLifetime, endLifetime, mergedData); result[i] = mergedEventTree; } return(result); }
public unsafe List <IEvent> BuildChildren(IEventTree parent, byte[] data) { List <IEvent> events = new List <IEvent>(); fixed(byte *dataPointer = data) { for (int offset = 0; offset < data.Length; offset += NativeEventHelper.EventSize) { if (NativeEventHelper.GetDepth(dataPointer + offset) == 0) { IEvent @event = new Event(parent, data, offset, this); events.Add(@event); } } } return(events); }
private IEventTree[] MergeByThreads(IEnumerable <ISingleEventTree> source) { IGrouping <uint, ISingleEventTree>[] groups = source.GroupBy(x => x.ThreadUid).ToArray(); IEventTree[] result = new IEventTree[groups.Length]; for (int i = 0; i < groups.Length; i++) { ISingleEventTree[] items = groups[i].ToArray(); uint beginLifetime = items.Min(x => x.BeginLifetime); uint endLifetime = items.Max(x => x.EndLifetime); uint threadOsId = items[0].ThreadOsId; uint threadUid = items[0].ThreadUid; List <byte[]> data = items.Select(x => x.GetBinaryData()).ToList(); uint hits = 1; uint time = (uint)data.Sum(x => NativeEventHelper.GetTime(x)); byte[] mergedData = _agentLibrary.MergeEventTrees(data, NativeEventHelper.CreateEvent(ThreadEventTreeMessage.EventType, 0, threadUid, time, hits)); ThreadEventTree threadEventTree = new ThreadEventTree(threadUid, threadOsId, beginLifetime, endLifetime, mergedData); result[i] = threadEventTree; } return(result); }