Mono.MicroThreads.MicroSocketManager.Tick C# (CSharp) Method

Tick() static private method

static private Tick ( int maxWaitMs ) : void
maxWaitMs int
return void
        internal static void Tick(int maxWaitMs)
        {
            if (s_socketList.Count == 0)
            {
                if (maxWaitMs > 0)
                {
                    //Console.WriteLine("sleep {0}", maxWaitMs);
                    System.Threading.Thread.Sleep(maxWaitMs);
                }
                return;
            }

            bool doSelect = false;

            List<Socket> readList = new List<Socket>(s_socketList.Count);
            List<Socket> writeList = new List<Socket>(s_socketList.Count);
            List<Socket> errorList = new List<Socket>(s_socketList.Count);

            foreach (MicroSocket s in s_socketList)
            {
                //Console.WriteLine("State {0}", s.State);

                if (s.m_readingThread != null)
                {
                    readList.Add(s.Socket);
                    doSelect = true;
                }

                if (s.m_writingThread != null)
                {
                    writeList.Add(s.Socket);
                    doSelect = true;
                }

                if (s.m_readingThread != null || s.m_writingThread != null)
                {
                    errorList.Add(s.Socket);
                }

                s.m_selectStatus = 0;
            }

            if (doSelect == false)
            {
                if(maxWaitMs > 0)
                {
                    Console.WriteLine("sleep");
                    System.Threading.Thread.Sleep(maxWaitMs);
                }
                return;
            }
            /*
            if(maxWaitMs > 0)
                Console.WriteLine("select timeout {0}", maxWaitMs);
            */
            Socket.Select(readList, writeList, errorList, maxWaitMs * 1000);

            foreach (Socket s in readList)
            {
                //Console.WriteLine("Read event");

                MicroSocket ms = s_socketMap[s];

                ms.m_selectStatus |= MicroSocketSelectStatus.Read;

                if (ms.m_readingThread != null)
                {
                    ms.m_readingThread.WakeUp();
                }
            }

            foreach (Socket s in writeList)
            {
                //Console.WriteLine("Write event");

                MicroSocket ms = s_socketMap[s];

                ms.m_selectStatus |= MicroSocketSelectStatus.Write;

                if (ms.m_writingThread != null)
                {
                    ms.m_writingThread.WakeUp();
                }
            }

            foreach (Socket s in errorList)
            {
                Console.WriteLine("ERROR event");

                MicroSocket ms = s_socketMap[s];
                ms.m_selectStatus |= MicroSocketSelectStatus.Error;

                if (ms.m_readingThread != null)
                {
                    ms.m_readingThread.WakeUp();
                }

                if (ms.m_writingThread != null)
                {
                    ms.m_writingThread.WakeUp();
                }
            }
        }

Usage Example

        void RunManagers()
        {
            Print("RunManagers()");

            m_threadsScheduledAfterManagers = 0;

            int nextWakeUp = ManageSleepers();

            if (nextWakeUp == -1)
            {
                nextWakeUp = 500;
            }

            if (m_scheduledThreadCount > 0)
            {
                nextWakeUp = 0;
            }

            Print("RunManagers(): nextWakeUp {0}", nextWakeUp);
            MicroSocketManager.Tick(nextWakeUp);
        }