home *** CD-ROM | disk | FTP | other *** search
- -- ++
- -- An implementation of the Sieve of Erastosthenes, a standard benchmark.
- -- This is a rather heavyweight implementation, since each prime number
- -- creates a new task. However, it illustrates the use of dynamic tasks.
- -- --
-
- with Text_IO;
- procedure Sieve_Pump is
-
- package Integer_IO is new Text_IO.Integer_IO ( Integer );
-
- task type Pump is
- -- determine if Num is prime and display it on the console if it is
- entry Insert ( Num : Integer );
- end Pump;
-
- type A_Pump is access Pump;
-
- function Make_Pump return A_Pump is
- begin
- return new Pump;
- end Make_Pump;
-
- task body Pump is
-
- Next_Task : A_Pump := Null;
- My_Number : Integer;
-
- begin
-
- accept Insert ( Num : Integer ) do
- My_Number := Num;
- end Insert;
- Integer_IO.Put ( My_Number );
- Text_IO.New_Line;
-
- loop
- accept Insert ( Num : Integer ) do
-
- -- is Num divisible by our prime number ?
- if Num mod My_Number /= 0 then
-
- -- create the next task if it hasn't been created yet.
- if Next_Task = Null then
- Next_Task := Make_Pump;
- end if;
-
- -- send the new number onto the next task
- Next_Task.Insert ( Num );
-
- end if;
-
- end Insert;
- end loop;
-
- end Pump;
-
- begin
-
- declare
- The_Pump : Pump;
- begin
- for I in 2 .. 8191 loop
- The_Pump.Insert ( I );
- end loop;
- end;
-
- end Sieve_Pump;