---------------------------------
-- D. Mathieu                  --
--                             --
-- fichier Essai07I.adb       --
--                             --
-- créé le 30/12/98            --
--                             --
---------------------------------
--
-- Programme de test de l'identification d'une tâche
-- Ce programme provoque l'affichage suivant (par exemple) :
--
-- La tache coucou_0244D378 vous dit Coucou
-- La tache coucou_0244D378 vous dit Coucou
-- Je suis la tache cadre : main_task_024449B0
-- Ma tache fille est     : coucou_0244D378
--
-- La tache coucou_0250160 vous dit Coucou
-- La tache coucou_0250160 vous dit Coucou
-- Je suis la tache cadre : main_task_024449B0
-- Ma tache fille est     : coucou_0250160
--
-- Remarque :
--   1) - noter l'utilisation des éléments du paquetage
--        Ada.Tsk_Identification : les fonctions Current_Task et
--                                 Image, le type Task_ID.
--   2) - noter aussi l'accès à une tâche par son identificateur.
--   3) - une tâche ne peut connaître directement que son propre
--        identificateur. Elle ne peut commaître l'identificateur
--        d'une autre tâche que si cette dernière le lui communique.
--   4) - Autant que possible, les affichages sont effectuées par un
--        seul appel à la fonction Put_Line, par concaténation de chaînes,
--        plutôt que par appels successifs à Put et Put_Line. Nous sommes
--        dans un contexte d'affichages concurrents, et nous pouvons
--        espérer que Put_Line est ATOMIQUE (il faudrait le vérifier).
--
with Ada.Text_Io;
use  Ada.Text_Io;
with Ada.Task_Identification;
use  Ada.Task_Identification;

procedure Essai07I is

   task type T_TskCoucou is
       entry WhoAreYou (MyNameIs : out Task_ID);
   end T_TskCoucou;

   task body T_TskCoucou is
 
   begin -- T_TskCoucou
 
      for I in 1..2 loop
         Put_Line (" La tache " & Image (Current_Task)
                                & " vous dit Coucou");
         delay 1.0;
      end loop;
 
      accept WhoAreYou (MyNameIs  : out Task_ID) do
         Put_Line (" La tache " & Image (WhoAreYou'Caller) & "m'appelle");
          MyNameIs  := Current_Task;
      end WhoAreYou;
 
   end T_TskCoucou;

begin -- Essai07I2

    declare
        Coucou : T_TskCoucou;
        T      : Task_ID;
    begin
        Coucou.WhoAreYou (T);
        Put_Line (" Je suis la tache cadre : " & Image (Current_Task));
        Put_Line (" Ma tache fille est     : " & Image (T));
    end;
 
    New_Line;
 
    declare
        Coucou : T_TskCoucou;
        T      : Task_ID;
    begin
        Coucou.WhoAreYou (T);
        Put_Line (" Je suis la tache cadre : " & Image (Current_Task));
        Put_Line (" Ma tache fille est     : " & Image (T));
    end;

end Essai07I;