[Home] [Prev] [Next] [Index]

9.11 Example of Tasking and Synchronization

9.11 Example of Tasking and Synchronization

Examples

1
The following example defines a buffer protected object to smooth variations between the  speed  of  output  of  a producing task and the speed of input of some consuming  task.   For  instance,  the  producing  task  might have the following structure:

2
task Producer;

3
task body Producer is
   Char : Character;
begin
   loop
      ... --  produce the next character Char
      Buffer.Write(Char);
      exit when Char = ASCII.EOT;
   end loop;
end Producer;

4
and the consuming task might have the following structure:

5
task Consumer;

6
task body Consumer is
   Char : Character;
begin
   loop
      Buffer.Read(Char);
      exit when Char = ASCII.EOT;
      ... --  consume the character Char
   end loop;
end Consumer;

7
The  buffer object contains an internal pool of characters managed in a round-robin fashion.  The pool has two indices, an  In_Index  denoting  the space  for the next input character and an Out_Index denoting the space for the next output character.

8
protected Buffer is
   entry Read (C : out Character);
   entry Write(C : in  Character);
private
   Pool      : String(1 .. 100);
   Count     : Natural := 0;
   In_Index, Out_Index : Positive := 1;
end Buffer;

9
protected body Buffer is
   entry Write(C : in Character)
      when Count < Pool'Length is
   begin
      Pool(In_Index) := C;
      In_Index := (In_Index mod Pool'Length) + 1;
      Count    := Count + 1;
   end Write;

10
   entry Read(C : out Character)
      when Count > 0 is
   begin
      C := Pool(Out_Index);
      Out_Index := (Out_Index mod Pool'Length) + 1;
      Count     := Count - 1;
   end Read;
end Buffer;



[Home] [Prev] [Next] [Index]

documentation@rational.com
Copyright © 1993-1998, Rational Software Corporation.   All rights reserved.