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();
}
}
}