예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        /// <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);
            }
        }