Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }