---------------------------------
-- D. Mathieu                  --
--                             --
-- fichier Priorite01.adb      --
--                             --
-- créé le 31/12/98            --
--                             --
---------------------------------
--
-- Gestion des priorités par une tâche contrôleur à plusieurs
-- points d'entrée.
--
-- 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 Priorite01 is

    TempsDebut : Time := Clock;
    TskAffiche : T_TskAffiche;
 
    task TskControleur is
        entry RequeteBasse   (Message : in String);
        entry RequeteNormale (Message : in String);
        entry RequeteUrgente (Message : in String);
    end TskControleur;
 
    task body TskControleur is

    begin -- TskControleur
 
        loop
            select
                accept RequeteUrgente (Message : in String) do
                    TskAffiche.JAffiche (Estampiller (TempsDebut) & " : " &
                                         Image (RequeteUrgente'Caller) &
                                         " servie : " & Message);
                    delay 2.0;
                end RequeteUrgente;
            or
                when   RequeteUrgente'Count = 0 =>
                accept RequeteNormale (Message : in String) do
                    TskAffiche.JAffiche (Estampiller (TempsDebut) & " : " &
                                         Image (RequeteNormale'Caller) &                                         " servie : " & Message);
                    delay 2.0;
                end RequeteNormale;
            or
                when   RequeteUrgente'Count = 0 and
                RequeteNormale'Count = 0 =>
                accept RequeteBasse (Message : in String) do
                    TskAffiche.JAffiche (Estampiller (TempsDebut) & " : " &
                                         Image (RequeteBasse'Caller) &
                                         " servie : " & Message);
                    delay 2.0;
                end RequeteBasse;
            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.RequeteUrgente ("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.RequeteNormale ("vite, vite");
 
    end T_TskNormal;

    task type T_TskBasse (NbreSecondes : Natural);
 
    task body T_TskBasse is
 
    begin -- T_TskBasse
 
        delay NbreSecondes * 1.0;
        TskControleur.RequeteBasse ("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  -- Priorite01

    null;

end Priorite01;