/// <summary>Uruchamia oczekujący proces. Jeśli proces miał zostać zamknięty (WaitingForStopping == True), proces jest zamykany i funkcja zwraca 2</summary> /// <remarks>Ready -> Running</remarks> /// <returns> /// 0 - uruchomiono 1 - stan inny niż Ready 2 - proces został zakończony /// </returns> public int RunReadyProcess() { if (State == ProcessState.Ready) { if (WaitingForStopping) { //odblokuj proces zamykający if (ClosingProcess != null) { StopperLock.Unlock(this.Name); ClosingProcess = null; } Console.WriteLine("Odblokowano proces oczekujacy na zamkniecie biezacego procesu: "); State = ProcessState.Terminated; CPU.Scheduler.GetInstance.RemoveProcess(this); Console.WriteLine("Zamknieto czekajacy na zamkniecie proces wchodzacy do stanu Running: " + this.ToString() + "."); this.RemoveProcess(); return(2); } else { State = ProcessState.Running; Console.WriteLine("Uruchomiono proces czekajacy na procesor: " + this.ToString() + "."); return(0); } } else { Console.WriteLine("Blad uruchamiania czekajacego procesu: Proces ma stan inny niz Ready: " + this.ToString() + "."); return(1); } }
/// <summary> /// Zamyka proces (stan = terminated) /// </summary> /// <param name="ClosingProcess">Proces zamykający (tylko, jesli przyczyna = KilledByOther, w p.p. null)</param> /// <returns> /// 0 - zamknięto proces /// 1 - proces oczekuje na zamkniecie /// 2 - jeśli zamykany przez inny proces, nie podano procesu zamykającego /// 3 - próba zamknięcia procesu systemowego /// </returns> public int TerminateProcess(ReasonOfProcessTerminating Reason, PCB ClosingProcess = null, int ExitCode = 0) { if (Reason == ReasonOfProcessTerminating.KilledByOther && ClosingProcess == null) { Console.WriteLine("Blad zamykania procesu: nie podano procesu zamykajacego."); return(2); } if (PID == 0) { Console.WriteLine("Nie mozna zamknac procesu systemowego."); return(3); } string ReasonString = "(brak powodu)"; switch (Reason) { case ReasonOfProcessTerminating.Ended: ReasonString = "Proces sie zakonczyl."; break; case ReasonOfProcessTerminating.ThrownError: ReasonString = "Wystapil blad w procesie."; break; case ReasonOfProcessTerminating.UserClosed: ReasonString = "Proces zostal zakmniety przez uzytkownika."; break; case ReasonOfProcessTerminating.CriticalError: ReasonString = "Program spowodowal wystapienie bledu krytycznego i zostal zamkniety przez system."; break; case ReasonOfProcessTerminating.KilledByOther: ReasonString = "Proces zostal zamkniety przez proces " + ClosingProcess.ToString() + "."; break; case ReasonOfProcessTerminating.ClosingSystem: ReasonString = "Proces zostal zamkniety z powodu zamykania systemu."; break; } if (State == ProcessState.Running) { State = ProcessState.Terminated; CPU.Scheduler.GetInstance.RemoveProcess(this); Console.WriteLine("Zakonczono proces " + this.ToString() + "."); Console.WriteLine("Powod zamkniecia: " + ReasonString); Console.WriteLine("Kod wyjscia procesu: " + ExitCode.ToString()); this.RemoveProcess(); return(0); } else { WaitingForStopping = true; Console.WriteLine("Oczekiwanie na zamkniecie procesu: " + this.ToString() + "."); Console.WriteLine("Proces zostanie zamkniety po przejsciu do stanu Running."); Console.WriteLine("Kod wyjscia procesu: " + ExitCode.ToString()); Console.WriteLine("Powod zamkniecia: " + ReasonString); //Zablokuj proces zamykający if (Reason == ReasonOfProcessTerminating.KilledByOther) { this.ClosingProcess = ClosingProcess; StopperLock.Lock(ClosingProcess); } return(1); } }