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_posix_t *native = stackalloc zmq_pollitem_posix_t[1];

                // fixed (zmq_pollitem_posix_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 == ZError.EINTR)
                    {
                        error = default(ZError);
                        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_posix_t *natives = (zmq_pollitem_posix_t *)Ptr.Ptr;
            var state = zmq.poll(natives, Size, TimeoutMs);

            return(state != -1);
        }
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_posix_t *natives = stackalloc zmq_pollitem_posix_t[count];

                // fixed (zmq_pollitem_posix_t* natives = managedArray) {

                for (int i = 0; i < count; ++i)
                {
                    ZSocket               socket = sockets.ElementAt(i);
                    ZPollItem             item   = items.ElementAt(i);
                    zmq_pollitem_posix_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();

                    if (error == ZError.EINTR)
                    {
                        error = default(ZError);
                        continue;
                    }
                    break;
                }

                for (int i = 0; i < count; ++i)
                {
                    ZPollItem             item   = items.ElementAt(i);
                    zmq_pollitem_posix_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_posix_t) * sockets.Length);
            zmq_pollitem_posix_t *natives = (zmq_pollitem_posix_t *)Ptr.Ptr;

            for (int i = 0; i < Size; ++i)
            {
                zmq_pollitem_posix_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>
        /// <returns></returns>
        public bool CheckOut(int index, out ZMessage message)
        {
            zmq_pollitem_posix_t *native = ((zmq_pollitem_posix_t *)Ptr.Ptr) + index;

            if (native->ReadyEvents == 0)
            {
                message = null;
                return(false);
            }
            if (!((ZPollEvent)native->ReadyEvents).HasFlag(ZPollEvent.Out))
            {
                message = null;
                return(false);
            }
            return(Sockets[index].Recv(out message, 1));
        }