internal static unsafe bool PollSingle( ZSocket socket, ZPollItem item, ZPollEvent pollEvents, out ZError error, TimeSpan?timeout = null) { error = default(ZError); bool result = false; int timeoutMs = !timeout.HasValue ? -1 : (int)timeout.Value.TotalMilliseconds; zmq_pollitem_windows_t *native = stackalloc zmq_pollitem_windows_t[1]; // fixed (zmq_pollitem_windows_t* native = managedArray) { native->SocketPtr = socket.SocketPtr; native->Events = (short)(item.Events & pollEvents); native->ReadyEvents = (short)ZPollEvent.None; while (!(result = (-1 != zmq.poll(native, 1, timeoutMs)))) { error = ZError.GetLastErr(); /* if (error == ZmqError.EINTR) * { * error = default(ZmqError); * continue; * } */ break; } item.ReadyEvents = (ZPollEvent)native->ReadyEvents; // } return(result); }
/// <summary> /// 一次Pool /// </summary> /// <returns></returns> public bool Poll() { error = null; zmq_pollitem_windows_t *natives = (zmq_pollitem_windows_t *)Ptr.Ptr; var state = zmq.poll(natives, Size, TimeoutMs); return(state > 0); }
internal static unsafe bool PollMany( IEnumerable <ZSocket> sockets, IEnumerable <ZPollItem> items, ZPollEvent pollEvents, out ZError error, TimeSpan?timeout = null) { error = default(ZError); bool result = false; int count = items.Count(); int timeoutMs = !timeout.HasValue ? -1 : (int)timeout.Value.TotalMilliseconds; zmq_pollitem_windows_t *natives = stackalloc zmq_pollitem_windows_t[count]; // fixed (zmq_pollitem_windows_t* natives = managedArray) { for (int i = 0; i < count; ++i) { ZSocket socket = sockets.ElementAt(i); ZPollItem item = items.ElementAt(i); zmq_pollitem_windows_t *native = natives + i; native->SocketPtr = socket.SocketPtr; native->Events = (short)(item.Events & pollEvents); native->ReadyEvents = (short)ZPollEvent.None; } while (!(result = (-1 != zmq.poll(natives, count, timeoutMs)))) { error = ZError.GetLastErr(); // No Signalling on Windows /* if (error == ZmqError.EINTR) { * error = ZmqError.DEFAULT; * continue; * } */ break; } for (int i = 0; i < count; ++i) { ZPollItem item = items.ElementAt(i); zmq_pollitem_windows_t *native = natives + i; item.ReadyEvents = (ZPollEvent)native->ReadyEvents; } // } return(result); }
/// <summary> /// 准备 /// </summary> /// <param name="sockets"></param> /// <param name="events"></param> public void Prepare(ZPollEvent events, params ZSocket[] sockets) { Sockets = sockets; error = null; Size = sockets.Length; Ptr = DispoIntPtr.Alloc(sizeof(zmq_pollitem_windows_t) * sockets.Length); zmq_pollitem_windows_t *natives = (zmq_pollitem_windows_t *)Ptr.Ptr; for (int i = 0; i < Size; ++i) { zmq_pollitem_windows_t *native = natives + i; native->SocketPtr = sockets[i].SocketPtr; native->Events = (short)(events); native->ReadyEvents = (short)ZPollEvent.None; } }
/// <summary> /// 检查下标是否有数据 /// </summary> /// <param name="index"></param> /// <param name="message"></param> public bool CheckIn(int index, out ZMessage message) { zmq_pollitem_windows_t *native = ((zmq_pollitem_windows_t *)Ptr.Ptr) + index; if (native->ReadyEvents == 0) { message = null; return(false); } if (((ZPollEvent)native->ReadyEvents).HasFlag(ZPollEvent.In)) { return(Sockets[index].Recv(out message, 1)); } message = null; return(false); }
void PopulateNativeItems() { if (natItems != null) { Marshal.FreeHGlobal(new IntPtr(natItems)); } int sizeOne = Marshal.SizeOf(typeof(zmq_pollitem_windows_t)); natItems = (zmq_pollitem_windows_t *)Marshal.AllocHGlobal(sizeOne * items.Count) .ToPointer(); for (int i = 0; i < items.Count; i++) { natItems[i].SocketPtr = items[i].socket.SocketPtr; natItems[i].Events = items[i].events; natItems[i].ReadyEvents = 0; } }