public void Stop() { if (_stopFlag == 1) { return; } _abortBlocker?.Free(Constants.AbortState); _blockHandle?.Free(Constants.WaitOverState); _blockHandle?.Free(Constants.RmtGenState); _testsMaintainer.FreeHosts(); Thread.VolatileWrite(ref _stopFlag, 1); }
public bool HandleMessage(MessageBase message) { bool state = false; RmtGenMessage rmtGenMessage = (RmtGenMessage)message; if (rmtGenMessage.Params["MsgType"].Equals("Success")) { state = true; TestGenEventInfo genEventInfo = new TestGenEventInfo(rmtGenMessage.Id, TestGenState.GenerationOver, rmtGenMessage.Time); _globalInfo.EventQueue.Enqueue(genEventInfo); _runtimeContainers[rmtGenMessage.Id].HostReady = true; } else if (rmtGenMessage.Params["MsgType"].Equals("Failed")) { state = false; TestGenEventInfo genEventInfo = new TestGenEventInfo(rmtGenMessage.Id, TestGenState.Error, rmtGenMessage.Time) { ErrorInfo = rmtGenMessage.Params["FailedInfo"] }; _globalInfo.EventQueue.Enqueue(genEventInfo); FreeHost(rmtGenMessage.Id); } // 如果所有的host都已经ready,则释放主线程等待生成结束的锁 if (_runtimeContainers.Values.All(item => item.HostReady)) { _blockHandle.Free(Constants.RmtGenState); } return(state); }
private bool HandleControlMessage(ControlMessage message) { int session = message.Id; string name = message.Name; switch (name) { case MessageNames.CtrlAbort: bool abortSuccess = bool.Parse(message.Params["AbortSuccess"]); AbortEventInfo abortEventInfo = new AbortEventInfo(session, false, abortSuccess); if (!abortSuccess && message.Params.ContainsKey("Message")) { abortEventInfo.FailInfo = message.Params["Message"]; } _globalInfo.EventQueue.Enqueue(abortEventInfo); _testsMaintainer.FreeHost(session); // 如果所有的都已经结束,则修改状态机状态 if (0 == _testsMaintainer.TestContainers.Count) { _globalInfo.StateMachine.State = RuntimeState.Abort; } // 同步释放,每个Session的停止都是同步执行的。 _blockHandle.Free(Constants.AbortState); break; default: throw new InvalidOperationException(); } return(true); }