---------------------------------
-- D. Mathieu                  --
--                             --
-- fichier Essai07A.adb        --
--                             --
-- créé le 13/12/98            --
--                             --
---------------------------------
--
-- Programme de test de l'attribut d'une tâche
--
-- Lors de l'élaboration d'une tâche, celle-ci reçoit un attribut
-- initialisé à une valeur initiale, elle-même fixée lors de
-- l'instanciation du paquetage générique Ada.Task_Attributes.
-- Au cours de l'exécution de cette tâche, son attribut peut être modifié
-- par elle-même (voir --1) ou par une autre qui la connaît (voir --2)
-- La valeur initiale est cependant conservée et peut être rechargée à tout
-- moment par la procedure Reinitialize.
--
-- Ce programme provoque l'affichage suivant (chronogramme indispensable
-- pour suivre):
--
-- La tache coucou_0245D378 d'attribut A vous dit Coucou
-- La tache coucou_0245D378 d'attribut A vous dit Coucou
-- La tache coucou_0245D378 d'attribut C vous dit Coucou
--
-- La tache coucou_02460160 d'attribut A vous dit Coucou
-- La tache coucou_02460160 d'attribut B vous dit Coucou
-- La tache coucou_02460160 d'attribut B vous dit Coucou
--
-- Remarques :
--   1) - On notera l'utilisation des sous-programmes Value ("accesseur de
--        l'attribut"), Set_Value ("modifieur de l'attribut") et Reinitialize
--        du paquetage Ada.Task_Attributes instancié par le type Character
--
with Ada.Text_Io;
use  Ada.Text_Io;
with Ada.Task_Identification;
use  Ada.Task_Identification;
with Ada.Task_Attributes;

procedure Essai07A is

   package New_Task_Attributes is
              new Ada.Task_Attributes  (Character, 'A');
   use     New_Task_Attributes;
 
   task type T_TskCoucou is
       entry WhoAreYou (MyNameIs : out Task_ID);
   end T_TskCoucou;

   task body T_TskCoucou is
 
   begin -- T_TskCoucou
 
      accept WhoAreYou (MyNameIs  : out Task_ID) do
          MyNameIs  := Current_Task;
      end WhoAreYou;
 
      for I in 1..2 loop
         Put_Line (" La tache " & Image (Current_Task)
                                & " d'attribut "
                                & Value (Current_Task)
                                & " vous dit Coucou");
         delay 1.0;
      end loop;
 
      Set_Value (Character'Succ (Value), Current_Task);   --1
      Put_Line  (" La tache " & Image (Current_Task)
                              & " d'attribut "
                              & Value (Current_Task)
                              & " vous dit Coucou");
   end T_TskCoucou;

begin -- Essai07A

    declare
        Coucou : T_TskCoucou;
        T      : Task_ID;
    begin
        Coucou.WhoAreYou (T);
        Delay 1.5;
        Set_Value (Character'Succ (Value), T);    --2
    end;
 
    New_Line;
 
    declare
        Coucou : T_TskCoucou;
        T      : Task_ID;
    begin
        Coucou.WhoAreYou (T);
        Delay 0.5;
        Set_Value (Character'Succ (Value), T);   --2
        delay 1.0;
        ReInitialize (T);                        --3
    end;

end Essai07A;