public ProgramExecutor(ProgramExecutionRequest executionRequest) { ExecutionRequest = executionRequest; ConfigureProcess(); InitializeExecutionResult(); void ConfigureProcess() { _process = new Process { EnableRaisingEvents = true, PriorityClass = ProcessPriorityClass.BelowNormal, StartInfo = new ProcessStartInfo { RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, StandardInputEncoding = Encoding.UTF8, StandardOutputEncoding = Encoding.UTF8, StandardErrorEncoding = Encoding.UTF8, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false, ErrorDialog = false, FileName = ExecutionRequest.StartInformation.Path, WorkingDirectory = ExecutionRequest.StartInformation.WorkingDirectory, Arguments = ExecutionRequest.StartInformation.Arguments } }; // Add custom environment variables _process.StartInfo.Environment.Add(ExecutionRequest.StartInformation.Environment); if (ExecutionRequest.RunAsFeature.Enabled) { _process.StartInfo.UserName = ExecutionRequest.RunAsFeature.UserName; /* * To workaround not implemented * features in current .NET Core * release. */ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // No implementation in other systems _process.StartInfo.PasswordInClearText = ExecutionRequest.RunAsFeature.UserPasswordClearText; // Windows-only feature _process.StartInfo.Domain = ExecutionRequest.RunAsFeature.UserDomain; _process.StartInfo.LoadUserProfile = false; } else { /* * Find a way to run as another user with * password on other operation systems. */ } } } void InitializeExecutionResult() { ExecutionResult = new ProgramExecutionResult { RuntimeResourcesUsage = new ProgramExecutionResult.ProgramRuntimeResourcesUsage { DiskSpaceUsage = 0, PeakMemoryUsage = 0, ProcessorTime = 0, RealExecutionTime = 0 } }; } }
private ProgramExecutionResult CanBeSolvedWithDfs( HashSet <ProgramState> stateSet, bool[,] eatenStarsMask, ref ProgramState state, ref int starsEaten, Program program) { Debug.Assert(state.Instruction == 0); for (int instr = 0; instr < program.GetInstructionCountInFunc(state.Func); ++instr) { state.Instruction = instr; // Loop check if (stateSet.Contains(state)) { return(ProgramExecutionResult.Fail); } FieldColor currentColor = this.colors[state.Position.X, state.Position.Y]; ProgramSlot slot = program.GetProgramSlot(state.Func, state.Instruction); if (slot.Action == ProgramAction.None) { continue; } if (slot.Color != FieldColor.None && slot.Color != currentColor) { continue; } if (slot.Action == ProgramAction.Forward || slot.Action == ProgramAction.Left || slot.Action == ProgramAction.Right) { switch (slot.Action) { case ProgramAction.Left: state.Dir = (state.Dir - 1 + 4) % 4; break; case ProgramAction.Right: state.Dir = (state.Dir + 1) % 4; break; case ProgramAction.Forward: Coord newPosition = state.Position; newPosition.X += shiftX[state.Dir]; newPosition.Y += shiftY[state.Dir]; state.Position = newPosition; if (state.Position.X < 0 || state.Position.Y < 0 || state.Position.X >= this.width || state.Position.Y >= this.height) { return(ProgramExecutionResult.Fail); } if (colors[state.Position.X, state.Position.Y] == FieldColor.None) { return(ProgramExecutionResult.Fail); } // If star was eaten after this turn if (this.stars[state.Position.X, state.Position.Y] && !eatenStarsMask[state.Position.X, state.Position.Y]) { eatenStarsMask[state.Position.X, state.Position.Y] = true; starsEaten += 1; if (starsEaten == this.starsCount) { return(ProgramExecutionResult.StarsEaten); } } break; } } else if (slot.Action == ProgramAction.F1 || slot.Action == ProgramAction.F2 || slot.Action == ProgramAction.F3 || slot.Action == ProgramAction.F4 || slot.Action == ProgramAction.F5) { ProgramState stateToPass = state; stateToPass.Instruction = 0; switch (slot.Action) { case ProgramAction.F1: stateToPass.Func = 0; break; case ProgramAction.F2: stateToPass.Func = 1; break; case ProgramAction.F3: stateToPass.Func = 2; break; case ProgramAction.F4: stateToPass.Func = 3; break; case ProgramAction.F5: stateToPass.Func = 4; break; } stateSet.Add(state); ProgramExecutionResult result = CanBeSolvedWithDfs(stateSet, eatenStarsMask, ref stateToPass, ref starsEaten, program); stateSet.Remove(state); state.Position = stateToPass.Position; state.Dir = stateToPass.Dir; if (result != ProgramExecutionResult.StillWorking) { return(result); } } } return(ProgramExecutionResult.StillWorking); }