コード例 #1
0
ファイル: Poller.cs プロジェクト: SPERONIS/Communication_Mono
        public void Loop()
        {
            while (!m_stopping)
            {
                if (m_new)
                {
                    foreach (PollSet pollSet in m_tempFDs)
                    {
                        m_fds.Add(pollSet);
                    }
                    m_tempFDs.Clear();
                    m_new = false;
                }

                //  Execute any due timers.
                int timeout = ExecuteTimers();

                Array.Copy(m_sourceSetIn, 1, m_readFDs, 1, m_readCount);
                Array.Copy(m_sourceSetOut, 1, m_writeFDs, 1, m_writeCount);
                Array.Copy(m_sourceSetError, 1, m_errorFDs, 1, m_errorCount);

                m_readFDs[0]  = (IntPtr)m_readCount;
                m_writeFDs[0] = (IntPtr)m_writeCount;
                m_errorFDs[0] = (IntPtr)m_errorCount;

                NativeMethods.TimeValue tv = new NativeMethods.TimeValue(timeout / 1000, timeout % 1000 * 1000);

                int rc;

                if (timeout != 0)
                {
                    rc = NativeMethods.@select(0, m_readFDs, m_writeFDs, m_errorFDs, ref tv);
                }
                else
                {
                    rc = NativeMethods.@select(0, m_readFDs, m_writeFDs, m_errorFDs, IntPtr.Zero);
                }

                if (rc == -1)
                {
                    throw new SocketException();
                }

                // Debug.Assert(rc != -1);

                if (rc == 0)
                {
                    continue;
                }

                foreach (var item in m_fds)
                {
                    if (item.Cancelled)
                    {
                        continue;
                    }

                    if (FDIsSet(item.Socket, m_errorFDs))
                    {
                        item.Handler.InEvent();
                    }

                    if (item.Cancelled)
                    {
                        continue;
                    }

                    if (FDIsSet(item.Socket, m_writeFDs))
                    {
                        item.Handler.OutEvent();
                    }

                    if (item.Cancelled)
                    {
                        continue;
                    }

                    if (FDIsSet(item.Socket, m_readFDs))
                    {
                        item.Handler.InEvent();
                    }
                }

                if (m_retired)
                {
                    foreach (var item in m_fds.Where(k => k.Cancelled).ToList())
                    {
                        m_fds.Remove(item);
                    }

                    foreach (var item in m_tempFDs.Where(k => k.Cancelled).ToList())
                    {
                        m_tempFDs.Remove(item);
                    }

                    m_retired = false;
                }
            }
        }
コード例 #2
0
ファイル: Poller.cs プロジェクト: bubbafat/netmq
        public void Loop()
        {
            while (!m_stopping)
            {
                if (m_new)
                {
                    foreach (PollSet pollSet in m_tempFDs)
                    {
                        m_fds.Add(pollSet);
                    }
                    m_tempFDs.Clear();
                    m_new = false;
                }

                //  Execute any due timers.
                int timeout = ExecuteTimers();

                Array.Copy(m_sourceSetIn, 1, m_readFDs, 1, m_readCount);
                Array.Copy(m_sourceSetOut, 1, m_writeFDs, 1, m_writeCount);
                Array.Copy(m_sourceSetError, 1, m_errorFDs, 1, m_errorCount);

                m_readFDs[0] = (IntPtr)m_readCount;
                m_writeFDs[0] = (IntPtr)m_writeCount;
                m_errorFDs[0] = (IntPtr)m_errorCount;

                NativeMethods.TimeValue tv = new NativeMethods.TimeValue(timeout / 1000, timeout % 1000 * 1000);

                int rc;

                if (timeout != 0)
                {
                    rc = NativeMethods.@select(0, m_readFDs, m_writeFDs, m_errorFDs, ref tv);
                }
                else
                {
                    rc = NativeMethods.@select(0, m_readFDs, m_writeFDs, m_errorFDs, IntPtr.Zero);
                }

                if (rc == -1)
                {
                    throw new SocketException();
                }

                // Debug.Assert(rc != -1);

                if (rc == 0)
                {
                    continue;
                }

                foreach (var item in m_fds)
                {
                    if (item.Cancelled)
                    {
                        continue;
                    }

                    if (FDIsSet(item.Socket, m_errorFDs))
                    {
                        item.Handler.InEvent();
                    }

                    if (item.Cancelled)
                    {
                        continue;
                    }

                    if (FDIsSet(item.Socket, m_writeFDs))
                    {
                        item.Handler.OutEvent();
                    }

                    if (item.Cancelled)
                    {
                        continue;
                    }

                    if (FDIsSet(item.Socket, m_readFDs))
                    {
                        item.Handler.InEvent();
                    }
                }

                if (m_retired)
                {
                    foreach (var item in m_fds.Where(k => k.Cancelled).ToList())
                    {
                        m_fds.Remove(item);
                    }

                    foreach (var item in m_tempFDs.Where(k => k.Cancelled).ToList())
                    {
                        m_tempFDs.Remove(item);
                    }

                    m_retired = false;
                }
            }
        }