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. |