Tasking in Ada

procedure SHOPPING is

   task GET_SALAD;

   task GET_WINE;

   task GET_MEAT;

   task body GET_SALAD is
   begin
      BUY_SALAD;
   end GET_SALAD;

   task body GET_WINE is
   begin
      BUY_WINE;
   end GET_WINE;

   task body GET_MEAT is
   begin
      BUY_MEAT;
   end GET_MEAT;

begin
   null;
end SHOPPING;


procedure SHOPPING is

   task GET_SALAD is
      entry PAY (M : in MONEY);
      entry COLLECT (S : out SALAD);
   end GET_SALAD;

   task body GET_SALAD is
      CASH : MONEY;
      FOOD : SALAD;
   begin

      accept PAY (M : in MONEY) do
         CASH := M;
      end PAY;

      FOOD := BUY_SALAD (CASH);

      accept COLLECT (S : out SALAD) do
         S := FOOD;
      end COLLECT;
    
   end GET_SALAD;


task PROTECTED_VARIABLE is
   entry READ (X : out ITEM);
   entry WRITE (X : in ITEM);
end;


task body PROTECTED_VARIABLE is
   V : ITEM;
begin
   accept WRITE (X : in ITEM) do
      V := X;
   end;
   loop
      select
         accept READ( X : out ITEM) do
            X := V;
         end;
      or
         accept WRITE (X : in ITEM) do
            V := X;
         end;
      end select;
   end loop;
end PROTECTED_VARIABLE;


GUARDS


task BUFFERING is
   entry PUT (X : in ITEM);
   entry GET (X : out ITEM);
end;

task body BUFFERING is
   N : constant := 8;
   A : array (1..N) of ITEM;
   I, J : integer range 1..N := 1;
   COUNT : integer range 0..N := 0;
begin
   loop
      select
         when COUNT < N =>
         accept PUT (X : in ITEM) do
            A(I) := X;
         end;
         I := I mod N + 1;   COUNT := COUNT + 1;
      or
         when COUNT > 0 =>
         accept GET (X : out ITEM) do
            X := A(J);
         end;
         J := J mod N + 1;   COUNT := COUNT - 1;
      end select;
   end loop;
end BUFFERING;


Copyright ©2014, G. Hill Price
Send comments to G. Hill Price