---------------------------------
-- D. Mathieu                  --
--                             --
-- fichier Priorite02.adb      --
--                             --
-- créé le 31/12/98            --
--                             --
---------------------------------
--
-- Gestion des priorités par une tâche controleur avec une famille
-- d'entrées
--
-- Le chronogramme suivant est obtenu :
--
--     0---1---2---3---4---5---6---7---8---9--10--11
-- B1  ----ASSSSSSS--------------------------------
-- B2  ----A-------------------------------SSSSSSSS
-- N1  --------A-----------SSSSSSSS----------------
-- U1  --------A---SSSSSSSS------------------------
-- U2  ------------------------A---SSSSSSSS--------
--
-- où Bx, Nx et Ux désignent les tâches clients de priorité Basse,
-- Normale et Urgente, A leur arrivée et S lorsqu'elles sont servies
--
with Ada.text_IO, P_Tsk_BAO, Calendar, Ada.Task_Identification;
use  Ada.text_IO, P_Tsk_BAO, Calendar, Ada.Task_Identification;

procedure Priorite02 is

    TempsDebut : Time := Clock;
    TskAffiche : T_TskAffiche;
 
    type T_Priorité is (Urgente, Normale, Basse);
 
    task TskControleur is
        entry Requete (T_Priorité) (Message : in String);
    end TskControleur;
 
    task body TskControleur is

    begin -- TskControleur
 
        loop
            select
                accept Requete (Urgente) (Message : in String) do
                    TskAffiche.JAffiche (Estampiller (TempsDebut) & " : " &
                                         Image (Requete'Caller) &
                                         " servie : " & Message);
                    delay 2.0;
                end Requete;
            or
                when   Requete (Urgente)'Count = 0 =>
                accept Requete (Normale) (Message : in String) do
                    TskAffiche.JAffiche (Estampiller (TempsDebut) & " : " &
                                         Image (Requete'Caller) &
                                         " servie : " & Message);
                    delay 2.0;
                end Requete;
            or
                when   Requete (Urgente)'Count = 0 and
                       Requete (Normale)'Count = 0 =>
                accept Requete (Basse) (Message : in String) do
                    TskAffiche.JAffiche (Estampiller (TempsDebut) & " : " &
                                         Image (Requete'Caller) &
                                         " servie : " & Message);
                    delay 2.0;
                end Requete;
            or
                terminate;
            end select;
        end loop;
    end TskControleur;
 
    task type T_TskUrgent (NbreSecondes : Natural);
 
    task body T_TskUrgent is
 
    begin -- T_TskUrgent
 
        delay NbreSecondes * 1.0;
        TskControleur.Requete (Urgente) ("vite, vite, vite");
 
    end T_TskUrgent;

    task type T_TskNormal (NbreSecondes : Natural);
 
    task body T_TskNormal is
 
    begin -- T_TskNormal
 
        delay NbreSecondes * 1.0;
        TskControleur.Requete (Normale) ("vite, vite");
 
    end T_TskNormal;

    task type T_TskBasse (NbreSecondes : Natural);
 
    task body T_TskBasse is
 
    begin -- T_TskBasse
 
        delay NbreSecondes * 1.0;
        TskControleur.Requete (Basse) ("vite");
 
    end T_TskBasse;
 
    TskBasse1  : T_TskBasse  (1);
    TskBasse2  : T_TskBasse  (1);
    TskNormal1 : T_TskNormal (2);
    TskUrgent1 : T_TskUrgent (2);
    TskUrgent2 : T_TskUrgent (6);
 
begin  -- Priorite02

    null;

end Priorite02;