Exemplo n.º 1
0
            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);
            }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
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);
            }
Exemplo n.º 4
0
        /// <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;
            }
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
        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;
            }
        }