示例#1
0
        public static unsafe Item ConvertItem(CEventTrace.Item *itemContainer)
        {
            var newItem = new Item();

            if (itemContainer->ItemType == 0)
            {
                // The item is newly initialized so return an empty Item
                return(newItem);
            }

            newItem.ItemType = (ItemType)itemContainer->ItemType;
            switch (newItem.ItemType)
            {
            case ItemType.Span:
                newItem.Span = new Span();

                var newSpan = newItem.Span.Value;
                ApiInterop.Memcpy(newSpan.Id.Data, itemContainer->ItemUnion.Span.Id.Data, SpanId.SpanIdSize);

                newSpan.Causes = new SpanId[(int)itemContainer->ItemUnion.Span.CauseCount];
                for (var i = 0; i < newSpan.Causes.Length; i++)
                {
                    fixed(byte *spanIdDest = newSpan.Causes[i].Data)
                    {
                        ApiInterop.Memcpy(spanIdDest, itemContainer->ItemUnion.Span.Causes[i].Data, SpanId.SpanIdSize);
                    }
                }

                newItem.Span = newSpan;
                break;

            case ItemType.Event:
                newItem.Event = new Event();

                var newEvent = newItem.Event.GetValueOrDefault();
                newEvent.Id = new SpanId();
                ApiInterop.Memcpy(newEvent.Id.Data, itemContainer->ItemUnion.Event.Id.Data, SpanId.SpanIdSize);

                newEvent.UnixTimestampMillis = itemContainer->ItemUnion.Event.UnixTimestampMillis;
                newEvent.Type    = ApiInterop.FromUtf8Cstr(itemContainer->ItemUnion.Event.Type);
                newEvent.Message = ApiInterop.FromUtf8Cstr(itemContainer->ItemUnion.Event.Message);

                newEvent.Data = new TraceEventData(itemContainer->ItemUnion.Event.Data);
                var fields = newEvent.Data.GetAll();
                // Release memory allocated to the underlying event data in the itemContainer
                newEvent.Data.EventData.Dispose();

                // Add the data to the newly initialized event data struct
                newEvent.Data = new TraceEventData(fields);

                newItem.Event = newEvent;
                break;

            default:
                throw new NotSupportedException("Invalid Item Type provided.");
            }

            return(newItem);
        }
示例#2
0
            private static void TraceCallbackThunk(void *callbackPtr, CEventTrace.Item *responseItem)
            {
                var callbackHandle = (EventTracerParameters)GCHandle.FromIntPtr((IntPtr)callbackPtr).Target;

                callbackHandle.TraceCallback(callbackHandle.UserData, ConvertItem(responseItem));
            }