---------------------------------
-- D. Mathieu                  --
--                             --
-- fichier Essai17.adb         --
--                             --
-- créé le 30/12/98            --
--                             --
---------------------------------
--
-- Programme de test d'arrêt d'une tâche pendant un rendez-vous
--
-- Dans la deuxième partie, l'exception levée dans le accept du
-- serveur est interceptée par le serveur et le client
--
-- L'exécution provoque l'édition suivante :
--
-- 0.010 : t1_02462F48 va appeler Synchro
-- 0.010 : t1_02462F48 servie
-- 1.011 : t2_02465D08 va appeler Synchro
-- 2.013 : t3_02468AC8 va appeler Synchro
-- 2.013 : t4_0246B888 va appeler Synchro
-- 3.024 : serveur hors de Synchro
-- 4.026 : t3_02468AC8 servie
-- 7.030 : serveur hors de Synchro
-- 8.031 : t4_0246B888 servie
-- 8.522 : t4_0246B888 : Tasking_error
--
-- ExcPropag interceptee par le serveur
-- ExcPropag interceptee par le client
--
-- Chronogramme "amusant" à faire.
--
-- Remarques :
-- 1) - la tâche 2 ayant été tuée pendant son attente au point
--      d'entrée Synchro a disparu complètement
-- 2) - la tâche T3 est tuée pendant qu'elle est servie. Cela
--      n'affecte pas le serveur ni la durée du service (qui se
--      prolonge jusqu'à 7 secondes)
-- 3) - La tâche t4 reçoit une exception lorsque le serveur est tué
--      alors qu'il est en train de la servir
--
with Ada.Text_IO, Ada.Task_Identification, P_Tsk_BAO, Calendar;
use  Ada.Text_IO, Ada.Task_Identification, P_Tsk_BAO, Calendar;

procedure Essai17 is

    TskAffiche : T_TskAffiche;
    TempsDebut : Time := Clock;

    task type T_Tsk (NbreSec : Integer := 0);

    task TskServeur is
        entry Synchro;
    end TskServeur;

    task body TskServeur is

    begin -- TskServeur

        loop
            accept Synchro do
                TskAffiche.JAffiche (Estampiller (TempsDebut) & " : " &
                                     Image(Synchro'Caller) & " servie");
                delay 3.0;
            end Synchro;
            TskAffiche.JAffiche (Estampiller (TempsDebut) & " : " &
                                 "Serveur hors de Synchro");
            delay 1.0;
        end loop;

    end TskServeur;

    task body T_Tsk is

    begin -- T_Tsk

        delay NbreSec * 1.0;
        TskAffiche.JAffiche (Estampiller (TempsDebut) & " : " &
                             S_Identifier & " va appeler Synchro");
        TskServeur.Synchro;
    exception
        when Tasking_Error =>
            TskAffiche.JAffiche (Estampiller (TempsDebut) & " : " &
                                 S_Identifier & " : Tasking_Error");
    end T_Tsk;

    T1     : T_Tsk;
    T2     : T_Tsk (1);
    T3, T4 : T_Tsk (2);

begin -- Essai17

    delay 2.5;
    abort T2;
    delay 2.0;
    abort T3;
    delay 4.0;
    abort TskServeur;

    declare
        ExcPropag : exception;

        task TskServeur is
            entry Entree;
        end TskServeur;

        task body TskServeur is

        begin -- TskServeur

            accept Entree do
                raise ExcPropag;
            end Entree;
        exception
            when ExcPropag =>
                  TskAffiche.JAffiche ("ExcPropag interceptee par le serveur");

        end TskServeur;

    begin
        TskServeur.Entree;
    exception
        when ExcPropag =>
            TskAffiche.JAffiche ("ExcPropag interceptee par le client");
    end;

end Essai17;