---------------------------------
-- D. Mathieu                  --
--                             --
-- fichier Essai10D.adb        --
--                             --
-- créé le 13/12/98            --
--                             --
---------------------------------
-- Programme de gestion des exceptions levées dans des tâches
-- filles. IV - exceptions levées au cours de l'élaboration
-- d'une tâche créée dynamiquement dans le corps de la tâche cadre.
--
-- Le programme provoque l'édition suivante :
--
-- t_tsklesautres( 1)_02465D18 : commence
-- t_tsklesautres( 1)_02465D18 : continue !!
-- Tache cadre : Tasking_Error
-- t_tsklesautres( 1)_02465D18 : continue !!
--
-- => La première exception levée DANS LE CORPS DE LA TACHE CADRE lors
--    de l'élaboration d'une tâche fille achève la tâche cadre.
--    Cependant, les autres tâches déjà élaborées et lancées continuent
--    normalement. La tâche cadre ne se termine que lorsque toutes les
--    tâches filles sont achevées.
--
with Ada.Text_IO, P_Tsk_BAO;
use  Ada.Text_IO, P_Tsk_BAO;

procedure Essai10D is

    I : Integer := 0;
 
    task type T_TskLesVilaines;
    task type T_TskLesAutres;
 
    task body T_TskLesVilaines is
 
        J : Integer := 3 / I;
 
    begin -- T_TskLesVilaines
 
        Put_Line (S_Identifier & " : commence");
 
    exception
        when others =>
             Put_Line (S_Identifier & " : division par zero");
 
    end T_TskLesVilaines;
 
    task body T_TskLesAutres is
 
    begin -- T_TskLesAutres
 
        Put_Line (S_Identifier & " : commence");
        for I in 1..2 loop
            Put_Line (S_Identifier & " : continue !!");
            delay 1.0;
        end loop;
 
    end T_TskLesAutres;
 
    type T_PtrTskLesVilaines is access T_TskLesVilaines;
    type T_PtrTskLesAutres   is access T_TskLesAutres;
    PtrLesVilaines : T_PtrTskLesVilaines;
    PtrLesAutres   : T_PtrTskLesAutres;
 
begin -- Essai10D
 
    for I in 1..2 loop
        PtrLesAutres   := new T_TskLesAutres;
        PtrLesVilaines := new T_TskLesVilaines;
    end loop;
 
  exception
    when Tasking_Error =>
        Put_Line ("Tache cadre : Tasking_Error");
    when others =>
        Put_Line ("Tache cadre : exception inattendue");
 
end Essai10D;