|
From: <br...@us...> - 2009-02-03 12:22:23
|
Revision: 482
http://acmcontester.svn.sourceforge.net/acmcontester/?rev=482&view=rev
Author: brus07
Date: 2009-02-03 11:33:16 +0000 (Tue, 03 Feb 2009)
Log Message:
-----------
Now SocketServer and -Client can work in opposite direction.
Submits come from Client and go to Server, Result from Server to Client.
Modified Paths:
--------------
ACMServer/trunk/ACMServer/Library/Connector/SocketServerTask.cs
ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGate.cs
ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGatePlugin.csproj
ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/WorkingPool.cs
ACMServer/trunk/ACMServer/Plugins/TesterPlugins/SocketClientGatePlugin/SocketClientGate.cs
ACMServer/trunk/ACMServer/Plugins/TesterPlugins/TestRunnerPlugin/TestRunnerPlugin.cs
Added Paths:
-----------
ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/WorkingPoolArrived.cs
Modified: ACMServer/trunk/ACMServer/Library/Connector/SocketServerTask.cs
===================================================================
--- ACMServer/trunk/ACMServer/Library/Connector/SocketServerTask.cs 2009-02-02 21:53:07 UTC (rev 481)
+++ ACMServer/trunk/ACMServer/Library/Connector/SocketServerTask.cs 2009-02-03 11:33:16 UTC (rev 482)
@@ -36,6 +36,11 @@
}
public override bool Send(SystemMessage message)
{
+ if (message.Description.IndexOf("not check busy") != -1)
+ {
+ DataSender(message, 0);
+ return true;
+ }
List<int> freeTesters = GetFreeTesters();
if (freeTesters.Count != 0)
{
Modified: ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGate.cs
===================================================================
--- ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGate.cs 2009-02-02 21:53:07 UTC (rev 481)
+++ ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGate.cs 2009-02-03 11:33:16 UTC (rev 482)
@@ -20,12 +20,14 @@
DataMediator dataContainer = new DataMediator();
WorkingPool pool = new WorkingPool();
+ WorkingPoolArrived poolArrived = new WorkingPoolArrived();
private SocketServerGate()
{
base.Start();
base.onDataArrived += DataArrived;
pool.onSendData += base.Send;
+ poolArrived.onSendData += DataArrived;
}
public static SocketServerGate GetInstance()
{
@@ -82,19 +84,80 @@
return true;
}
+ if (message.IsType("TestingResult"))
+ {
+ Result result = Result.CreateFromXml(message.Message);
+
+ string mes = "result " + result.Submit.id;
+ mes += " " + result.res;
+ OnLogMessage("Receive", mes);
+
+ message.Description = "not check busy";
+ base.Send(message);
+ dataContainer.Return(result);
+ }
+ if (message.IsType("TestingResultIoi"))
+ {
+ ResultIoi result = ResultIoi.CreateFromXml(message.Message);
+
+ string mes = "result " + result.Submit.submit.id;
+ mes += " " + result.res;
+ OnLogMessage("Receive", mes);
+
+ message.Description = "not check busy";
+ base.Send(message);
+ dataContainer.Return(result.ToResult());
+ }
+ if (message.IsType("CheckStateResult"))
+ {
+ poolArrived.Send(message);
+ }
+
return false;
}
protected override void DataArriver(SystemMessage message)
{
- Result result = Result.CreateFromXml(message.Message);
+ if (message.IsType("TestingResult"))
+ {
+ Result result = Result.CreateFromXml(message.Message);
- string mes = "result " + result.Submit.id;
- mes += " " + result.res;
- OnLogMessage("Receive", mes);
+ string mes = "result " + result.Submit.id;
+ mes += " " + result.res;
+ OnLogMessage("Receive", mes);
- base.DataArriver(message);
- dataContainer.Return(result);
+ base.DataArriver(message);
+ dataContainer.Return(result);
+ }
+
+ if (message.IsType("TestingSubmit"))
+ {
+ Submit submit = Submit.CreateFromXml(message.Message);
+
+ if (dataContainer.Add(submit))
+ {
+ OnLogMessage("SystemSend", submit.id + " to Pool");
+ poolArrived.Send(message);
+ }
+ else
+ {
+ OnLogMessage("SystemReceive", submit.id + "is in queue");
+ }
+ }
+ if (message.IsType("TestingSubmitIoi"))
+ {
+ SubmitIoi submit = SubmitIoi.CreateFromXml(message.Message);
+
+ if (dataContainer.Add(submit.submit))
+ {
+ OnLogMessage("SystemSend", submit.submit.id + " to Pool");
+ poolArrived.Send(message);
+ }
+ else
+ {
+ OnLogMessage("SystemReceive", submit.submit.id + "is in queue");
+ }
+ }
}
private void DataArrived(SystemMessage message)
{
Modified: ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGatePlugin.csproj
===================================================================
--- ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGatePlugin.csproj 2009-02-02 21:53:07 UTC (rev 481)
+++ ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/SocketServerGatePlugin.csproj 2009-02-03 11:33:16 UTC (rev 482)
@@ -39,6 +39,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
+ <Compile Include="WorkingPoolArrived.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SocketServerGate.cs" />
<Compile Include="SocketServerGatePlugin.cs" />
Modified: ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/WorkingPool.cs
===================================================================
--- ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/WorkingPool.cs 2009-02-02 21:53:07 UTC (rev 481)
+++ ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/WorkingPool.cs 2009-02-03 11:33:16 UTC (rev 482)
@@ -13,8 +13,16 @@
private bool OnSendData(SystemMessage sysMes)
{
- if (onSendData != null)
- return onSendData(sysMes);
+ if (sysMes.IsType("TestingSubmit") == true)
+ {
+ if (onSendData != null)
+ return onSendData(sysMes);
+ }
+ if (sysMes.IsType("TestingSubmitIoi") == true)
+ {
+ if (onSendData != null)
+ return onSendData(sysMes);
+ }
//TODO: ne znaju sho same maje povertatysja u takomu vypadku
return false;
}
Added: ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/WorkingPoolArrived.cs
===================================================================
--- ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/WorkingPoolArrived.cs (rev 0)
+++ ACMServer/trunk/ACMServer/Plugins/MediatorPlugins/SocketServerGatePlugin/WorkingPoolArrived.cs 2009-02-03 11:33:16 UTC (rev 482)
@@ -0,0 +1,158 @@
+using System;
+using AcmContester.Library.LibraryExtention;
+using System.Collections.Generic;
+using System.Threading;
+using AcmContester.Library.LibraryExtention.Data;
+
+namespace AcmContester.Plugins.MediatorPlugins.SocketServerGatePlugin
+{
+ class WorkingPoolArrived
+ {
+ internal delegate void SendDataDelegate(SystemMessage s);
+ internal event SendDataDelegate onSendData;
+
+ private bool OnSendData(SystemMessage sysMes)
+ {
+ if (sysMes.IsType("TestingSubmit"))
+ {
+ if (onSendData != null)
+ onSendData(sysMes);
+ }
+ if (sysMes.IsType("TestingSubmitIoi"))
+ {
+ if (onSendData != null)
+ onSendData(sysMes);
+ }
+ if (sysMes.IsType("CheckState"))
+ {
+ if (onSendData != null)
+ onSendData(sysMes);
+ }
+ return true;
+ }
+
+ private bool OnSendData2(SystemMessage sysMes)
+ {
+ if (IsFreeTester())
+ return OnSendData(sysMes);
+ return false;
+ }
+
+ private Dictionary<int, SystemMessage> poolWork = new Dictionary<int, SystemMessage>();
+ private bool poolWorking = false;
+
+ private void runPool()
+ {
+ if (poolWorking == true)
+ return;
+ poolWorking = true;
+ while (true)
+ {
+ Thread.Sleep(2000);
+ lock (poolWork)
+ {
+ if (poolWork.Count == 0)
+ break;
+ foreach (int key in poolWork.Keys)
+ {
+ SystemMessage sysMes = poolWork[key];
+ //TODO: potribno zrobyty, shob pry posylci "poolWork" ne buv zalokanyj
+ if (OnSendData2(sysMes) == true)
+ {
+ poolWork.Remove(key);
+ break;
+ }
+ }
+ }
+ }
+ poolWorking = false;
+ }
+ private static void StartPool(Object ob)
+ {
+ WorkingPoolArrived ssg = (WorkingPoolArrived)ob;
+ ssg.runPool();
+ }
+ private void startPool()
+ {
+ if (poolWorking == false)
+ {
+ ThreadPool.QueueUserWorkItem(StartPool, this);
+ }
+ }
+
+ internal void Send(SystemMessage sysMes)
+ {
+ if (sysMes.IsType("CheckStateResult"))
+ {
+ if (SystemMessageX(sysMes))
+ return;
+ }
+
+ lock (poolWork)
+ {
+ if (sysMes.IsType("TestingSubmit"))
+ {
+ //TODO: \xEF\xEE\xF2\xF0\xB3\xE1\xED\xEE \xE1\xF3\xE4\xE5 \xF6\xE5 \xE7\xE2\xB3\xE4\xF1\xE8 \xE7\xE0\xE1\xF0\xE0\xF2\xE8
+ Submit submit = Submit.CreateFromXml(sysMes.Message);
+ if (poolWork.ContainsKey(submit.id) == false)
+ poolWork.Add(submit.id, sysMes);
+ }
+ if (sysMes.IsType("TestingSubmitIoi"))
+ {
+ //TODO: \xEF\xEE\xF2\xF0\xB3\xE1\xED\xEE \xE1\xF3\xE4\xE5 \xF6\xE5 \xE7\xE2\xB3\xE4\xF1\xE8 \xE7\xE0\xE1\xF0\xE0\xF2\xE8
+ SubmitIoi submit = SubmitIoi.CreateFromXml(sysMes.Message);
+ if (poolWork.ContainsKey(submit.submit.id) == false)
+ poolWork.Add(submit.submit.id, sysMes);
+ }
+ }
+ startPool();
+ }
+
+
+ readonly Queue<string> q = new Queue<string>();
+
+ private bool IsFreeTester()
+ {
+ q.Clear();
+ SystemMessage mesa = new SystemMessage("isbusy", "CheckState");
+ OnSendData(mesa);
+
+ DateTime start = DateTime.Now;
+ while (true)
+ {
+ if ((DateTime.Now - start).TotalSeconds > 1.0)
+ {
+ break;
+ }
+ lock (q)
+ {
+ while (q.Count != 0)
+ {
+ string curStr = q.Dequeue();
+ if (curStr == "free")
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ }
+ System.Threading.Thread.Sleep(50);
+ }
+ return false;
+ }
+
+ private bool SystemMessageX(SystemMessage message)
+ {
+ if (message.Message == "busy" || message.Message == "free")
+ {
+ lock (q)
+ q.Enqueue(message.Message);
+ return true;
+ }
+ return false;
+ }
+ }
+}
Modified: ACMServer/trunk/ACMServer/Plugins/TesterPlugins/SocketClientGatePlugin/SocketClientGate.cs
===================================================================
--- ACMServer/trunk/ACMServer/Plugins/TesterPlugins/SocketClientGatePlugin/SocketClientGate.cs 2009-02-02 21:53:07 UTC (rev 481)
+++ ACMServer/trunk/ACMServer/Plugins/TesterPlugins/SocketClientGatePlugin/SocketClientGate.cs 2009-02-03 11:33:16 UTC (rev 482)
@@ -57,6 +57,19 @@
{
OnDataArrived(message);
}
+
+ if (message.IsType("TestingResult"))
+ {
+ Result res = Result.CreateFromXml(message.Message);
+ OnAddLogText("Receive", "ID " + res.Submit.id + " result - " + res.res);
+ OnDataArrived(message);
+ }
+ if (message.IsType("TestingResultIoi"))
+ {
+ ResultIoi res = ResultIoi.CreateFromXml(message.Message);
+ OnAddLogText("Receive", "ID " + res.Submit.submit.id + " result - " + res.res);
+ OnDataArrived(message);
+ }
}
public override bool Send(SystemMessage message)
@@ -76,6 +89,15 @@
OnAddLogText("Send", "ID " + res.Submit.id + " result - " + res.res);
}
+ if (message.IsType("TestingSubmit"))
+ {
+ OnAddLogText("Send", message.Message);
+ }
+ if (message.IsType("TestingSubmitIoi"))
+ {
+ OnAddLogText("Send", message.Message);
+ }
+
if (client == null)
return true;
Modified: ACMServer/trunk/ACMServer/Plugins/TesterPlugins/TestRunnerPlugin/TestRunnerPlugin.cs
===================================================================
--- ACMServer/trunk/ACMServer/Plugins/TesterPlugins/TestRunnerPlugin/TestRunnerPlugin.cs 2009-02-02 21:53:07 UTC (rev 481)
+++ ACMServer/trunk/ACMServer/Plugins/TesterPlugins/TestRunnerPlugin/TestRunnerPlugin.cs 2009-02-03 11:33:16 UTC (rev 482)
@@ -17,13 +17,13 @@
private bool runner_onDataArrived(SystemMessage message)
{
- if (message.IsType("TestingResult") == true)
+ if (message.IsType("TestingResult"))
{
SendResultToControl(message.Message, "Send");
base.DataArrived(message);
return true;
}
- if (message.IsType("TestingResultIoi") == true)
+ if (message.IsType("TestingResultIoi"))
{
ResultIoi res = ResultIoi.CreateFromXml(message.Message);
Result result = res.ToResult();
@@ -31,6 +31,11 @@
base.DataArrived(message);
return true;
}
+ if (message.IsType("CheckStateResult"))
+ {
+ base.DataArrived(message);
+ return true;
+ }
throw new Exception();
}
private void SendResultType(string text)
@@ -88,7 +93,7 @@
mes = new SystemMessage("free", "CheckStateResult");
}
SendMessageToControl(mes.Message, "SystemSend");
- Send(mes);
+ runner_onDataArrived(mes);
return;
}
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|