Ada 95 :: x70_cc1.ada

package Pack_factorial is
  task type Task_factorial is                -- Specification
    entry start( f:in Positive );            -- Rendezvous
    entry finish( result:out Positive );     -- Rendezvous
  end Task_factorial;
end Pack_factorial;

package body Pack_factorial is
  task body Task_factorial is                -- Implementation
    factorial : Positive;
    answer    : Positive := 1;
  begin
    accept start( f:in Positive ) do         -- Factorial
      factorial := f;
    end start;
    for i in 2 .. factorial loop             -- Calculate
      answer := answer * i;
    end loop;
    accept finish( result:out Positive ) do -- Return answer
      result := answer;
    end finish;
  end Task_factorial;
end Pack_factorial;

package Pack_is_a_prime is
  task type Task_is_prime is                 -- Specification
    entry start( p:in Positive );            -- Rendezvous
    entry finish( result:out Boolean );      -- Rendezvous
  end Task_is_prime;
end Pack_is_a_prime;

package body Pack_is_a_prime is
  task body Task_is_prime is                 -- Implementation
    prime : Positive;
    answer: Boolean := TRUE;
  begin
    accept start( p:in Positive ) do         -- Factorial
      prime := p;
    end start;
    for i in 2 .. prime-1 loop               -- Calculate
      if prime rem i = 0 then
        answer := FALSE; exit;
      end if;
    end loop;
    accept finish( result:out Boolean ) do  -- Return answer
      result := answer;
    end finish;
  end Task_is_prime;
end Pack_is_a_prime;

with Simple_io, Pack_factorial, Pack_is_a_prime;
use  Simple_io, Pack_factorial, Pack_is_a_prime;
procedure main is
  thread_1 : Task_factorial;
  thread_2 : Task_factorial;
  thread_3 : Task_is_prime;
  factorial: Positive;
  prime    : Boolean;

begin
  thread_1.start(5);            -- Start factorial calculation
  thread_2.start(7);            -- Start factorial calculation
  thread_3.start(97);           -- Start is_prime calculation

  put("Factorial  5 is ");
  thread_1.finish( factorial ); -- Obtain result
  put( factorial ); new_line;

  put("Factorial  8 is ");
  thread_2.finish( factorial ); -- Obtain result
  put( factorial ); new_line;

  put("97 is a prime is ");
  thread_3.finish( prime );     -- Obtain result
  if prime then put("True"); else put("False"); end if; new_line;

end main;


© M.A.Smith University of Brighton. Created September 1995 last modified May 1997.
Comments, suggestions, etc. M.A.Smith@brighton.ac.uk * [Home page]