Beispiel #1
0
        private void ProcessData(int count)
        {
            using (var ms = new MemoryStream(_readBuffer, 0, count, false))
                using (var br = new BinaryReader(ms, Encoding.UTF8, true))
                {
                    var expectedNextPacketIndex = Interlocked.Increment(ref _nextPacketIndex);

                    var packet_index = br.ReadInt64();
                    if (packet_index != expectedNextPacketIndex)
                    {
                        Debug.WriteLine(Util.ToHex(_readBuffer, 0, count));
                        throw new Exception($"Expected packet index wrong: {packet_index} != {expectedNextPacketIndex}");
                    }

                    var command = br.ReadInt32();
                    if (command == 0) // add allocation
                    {
                        AddDispatchEvent(AddAllocationRpcEvent.FromStream(br));
                    }
                    else if (command == 1) // remove allocation
                    {
                        AddDispatchEvent(RemoveAllocationRpcEvent.FromStream(br));
                    }
                    else if (command == 2) // pointer data
                    {
                        var requestId = br.ReadInt64();
                        Debug.WriteLine($"POINTER DATA, rid: {requestId}");

                        var bufferLength = (int)(br.BaseStream.Length - br.BaseStream.Position);
                        var buffer       = new byte[bufferLength];
                        Buffer.BlockCopy(_readBuffer, (int)br.BaseStream.Position, buffer, 0, bufferLength);

                        Request request;
                        _requestsLock.EnterWriteLock();
                        try
                        {
                            if (_requests.TryGetValue(requestId, out request))
                            {
                                _requests.Remove(requestId);
                            }
                        }
                        finally
                        {
                            _requestsLock.ExitWriteLock();
                        }

                        request.Response       = buffer;
                        request.ResponseLength = bufferLength;

                        request.Complete();
                    }
                }
        }
Beispiel #2
0
        public static AddAllocationRpcEvent FromStream(BinaryReader br)
        {
            var ev = new AddAllocationRpcEvent();

            ev.Time              = br.ReadDouble();
            ev.Filename          = br.BaseStream.ReadNullTerminatedString(260);
            ev.Line              = br.ReadInt32();
            ev.Function          = br.BaseStream.ReadNullTerminatedString(64);
            ev.Pointer           = br.ReadInt64();
            ev.SizeOfPointerData = br.ReadInt64();

            var stack = new long[32];

            for (int i = 0; i < stack.Length; ++i)
            {
                stack[i] = br.ReadInt64();
            }

            var frames = br.ReadUInt16();

            ev._stack.AddRange(stack.Take(frames));

            return(ev);
        }