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