コード例 #1
0
ファイル: ZPollItems.Win32.cs プロジェクト: ym1100/MicroZero
            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);
            }
コード例 #2
0
        public zmq_pollitem_posix_t(IntPtr socket, ZPollEvent pollEvents)
        {
            if (socket == IntPtr.Zero)
            {
                throw new ArgumentException("Expected a valid socket handle.", nameof(socket));
            }

            SocketPtr      = socket;
            FileDescriptor = 0;
            Events         = (short)pollEvents;
            ReadyEvents    = (short)ZPollEvent.None;
        }
コード例 #3
0
ファイル: ZPollItems.cs プロジェクト: ym1100/MicroZero
 public static bool Poll(this ZSocket socket, ZPollItem item, ZPollEvent pollEvents, ref ZMessage message, out ZError error, TimeSpan?timeout = null)
 {
     if (PollSingle(socket, item, pollEvents, out error, timeout))
     {
         if (PollSingleResult(socket, item, pollEvents, ref message))
         {
             return(true);
         }
         error = ZError.EAGAIN;
     }
     return(false);
 }
コード例 #4
0
ファイル: ZPollItems.Win32.cs プロジェクト: ym1100/MicroZero
            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);
            }
コード例 #5
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;
            }
        }
コード例 #6
0
ファイル: ZPollItems.cs プロジェクト: ym1100/MicroZero
        internal static bool PollSingleResult(ZSocket socket, ZPollItem item, ZPollEvent pollEvents, ref ZMessage message)
        {
            bool shouldReceive = item.ReceiveMessage != null && ((pollEvents & ZPollEvent.In) == ZPollEvent.In);
            bool shouldSend    = item.SendMessage != null && ((pollEvents & ZPollEvent.Out) == ZPollEvent.Out);

            if (pollEvents == ZPollEvent.In)
            {
                if (!shouldReceive)
                {
                    throw new InvalidOperationException("No ReceiveMessage delegate set for Poll.In");
                }

                if (OnReceiveMessage(socket, item, out message))
                {
                    if (!shouldSend)
                    {
                        return(true);
                    }

                    if (OnSendMessage(socket, item, message))
                    {
                        return(true);
                    }
                }
            }
            else if (pollEvents == ZPollEvent.Out)
            {
                if (!shouldSend)
                {
                    throw new InvalidOperationException("No SendMessage delegate set for Poll.Out");
                }

                if (OnSendMessage(socket, item, message))
                {
                    if (!shouldReceive)
                    {
                        return(true);
                    }

                    if (OnReceiveMessage(socket, item, out message))
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
コード例 #7
0
 public ZPollItem(ZPollEvent events)
 {
     Events = events;
 }
コード例 #8
0
ファイル: ZPollItems.cs プロジェクト: ym1100/MicroZero
        internal static bool PollManyResult(IEnumerable <ZSocket> sockets, IEnumerable <ZPollItem> items, ZPollEvent pollEvents, ref ZMessage[] messages)
        {
            int count      = items.Count();
            int readyCount = 0;

            bool send    = messages != null && ((pollEvents & ZPollEvent.Out) == ZPollEvent.Out);
            bool receive = ((pollEvents & ZPollEvent.In) == ZPollEvent.In);

            ZMessage[] incoming = null;
            if (receive)
            {
                incoming = new ZMessage[count];
            }

            for (int i = 0; i < count; ++i)
            {
                ZSocket   socket  = sockets.ElementAt(i);
                ZPollItem item    = items.ElementAt(i);
                ZMessage  message = send ? messages[i] : null;

                if (PollSingleResult(socket, item, pollEvents, ref message))
                {
                    ++readyCount;
                }
                if (receive)
                {
                    incoming[i] = message;
                }
            }

            if (receive)
            {
                messages = incoming;
            }
            return(readyCount > 0);
        }
コード例 #9
0
ファイル: ZPollItems.cs プロジェクト: ym1100/MicroZero
        public static bool Poll(this IEnumerable <ZSocket> sockets, IEnumerable <ZPollItem> items, ZPollEvent pollEvents, ref ZMessage[] messages, out ZError error, TimeSpan?timeout = null)
        {
            if (PollMany(sockets, items, pollEvents, out error, timeout))
            {
                if (PollManyResult(sockets, items, pollEvents, ref messages))
                {
                    return(true);
                }

                error = ZError.EAGAIN;
            }
            return(false);
        }