void Update()
{
while (true)
{
double oldHashrate = mHashrate;
mHashrate = 0;
if (mBlock == null || mUpstream.NewBlockReady() || mBlock.mHashMan.IsComplete() || mBlock.mHashMan.IsExpired())
{
// Start work on a new block
BeginBlock();
}
Client clientThatWantsInfo = null;
if (mClientListMutex.WaitOne(1))
{
int clientsOnline = mClients.Count;
foreach (Client c in mClients)
{
bool stillAlive = c.Update();
if (!stillAlive)
{
if (c.mCurrentBlock != null)
{
c.mCurrentBlock.mHashMan.FreeBlock(c.mHashBlock);
}
mClients.Remove(c);
break;
}
mHashrate += c.mHashrate;
if (c.mState == Client.State.Busy && c.mCurrentBlock != mBlock)
{
c.StopWork();
}
if (c.mState == Client.State.Ready)
{
AssignWork(c);
}
if (c.mStatusClient)
{
c.SendStatus(clientsOnline, oldHashrate);
}
if (c.mClientInfoRequested && clientThatWantsInfo == null)
{
clientThatWantsInfo = c;
c.mClientInfoRequested = false;
}
}
if (clientThatWantsInfo != null)
{
string info = "{\"clients\":[";
foreach (Client c in mClients)
{
info += c.ToJSON() + ",";
}
info = info.Substring(0, info.Length - 1);
info += "]}";
clientThatWantsInfo.SendClientInfo(info);
}
mClientListMutex.ReleaseMutex();
Thread.Sleep(50);
}
else
{
Thread.Sleep(1);
}
if (mDumpClients)
{
FileStream file = new FileStream("clients.txt", FileMode.Create);
StreamWriter sw = new StreamWriter(file);
mClientListMutex.WaitOne();
foreach (Client c in mClients)
{
string str = c.ToString();
sw.WriteLine(str);
}
mClientListMutex.ReleaseMutex();
sw.Close();
mDumpClients = false;
}
}
}