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);
 }