diff --git a/UIX/Microsoft/Iris/Debug/IDebuggerClient.cs b/UIX/Microsoft/Iris/Debug/IDebuggerClient.cs index f012698..5015f44 100644 --- a/UIX/Microsoft/Iris/Debug/IDebuggerClient.cs +++ b/UIX/Microsoft/Iris/Debug/IDebuggerClient.cs @@ -5,6 +5,11 @@ namespace Microsoft.Iris.Debug; public interface IDebuggerClient { + /// + /// The URI the client is connected to. + /// + string ConnectionUri { get; } + /// /// Fired when the UIX interpreter steps forward. /// diff --git a/UIX/Microsoft/Iris/Debug/ZmqDebuggerClient.cs b/UIX/Microsoft/Iris/Debug/ZmqDebuggerClient.cs index 4417772..57a76e5 100644 --- a/UIX/Microsoft/Iris/Debug/ZmqDebuggerClient.cs +++ b/UIX/Microsoft/Iris/Debug/ZmqDebuggerClient.cs @@ -2,6 +2,7 @@ using NetMQ; using NetMQ.Sockets; using System; +using System.Collections.Generic; using System.IO; using System.Runtime.Serialization; using System.Text; @@ -10,14 +11,19 @@ namespace Microsoft.Iris.Debug; public class ZmqDebuggerClient : IDebuggerClient, IDisposable { + private List _frames = new(2); private readonly SubscriberSocket _subSocket; private readonly IFormatter _formatter; + public string ConnectionUri { get; } + public event EventHandler InterpreterStep; public event Action DispatcherStep; public ZmqDebuggerClient(string connectionUri) { + ConnectionUri = connectionUri; + _subSocket = new(); _subSocket.Connect(connectionUri); _subSocket.SubscribeToAnyTopic(); @@ -34,7 +40,10 @@ public class ZmqDebuggerClient : IDebuggerClient, IDisposable { while (!_subSocket.IsDisposed) { - var type = RecieveDebuggerMessage(_subSocket, out var bytes); + DebuggerMessageType type; + byte[] bytes; + while (!TryRecieveDebuggerMessage(out type, out bytes)) + ; switch (type) { @@ -54,11 +63,17 @@ public class ZmqDebuggerClient : IDebuggerClient, IDisposable } } - private static DebuggerMessageType RecieveDebuggerMessage(SubscriberSocket socket, out byte[] bytes) + private bool TryRecieveDebuggerMessage(out DebuggerMessageType type, out byte[] bytes) { - var frames = socket.ReceiveMultipartBytes(2); + if (!_subSocket.IsDisposed && _subSocket.TryReceiveMultipartBytes(ref _frames, 2)) + { + type = (DebuggerMessageType)BitConverter.ToInt32(_frames[0], 0); + bytes = _frames[1]; + return true; + } - bytes = frames[1]; - return (DebuggerMessageType)BitConverter.ToInt32(frames[0], 0); + type = default; + bytes = null; + return false; } }