ADDED src/natools-parallelism.adb Index: src/natools-parallelism.adb ================================================================== --- src/natools-parallelism.adb +++ src/natools-parallelism.adb @@ -0,0 +1,68 @@ +------------------------------------------------------------------------------ +-- Copyright (c) 2016, Natacha Porté -- +-- -- +-- Permission to use, copy, modify, and distribute this software for any -- +-- purpose with or without fee is hereby granted, provided that the above -- +-- copyright notice and this permission notice appear in all copies. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -- +-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -- +-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -- +-- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -- +-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -- +-- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -- +-- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -- +------------------------------------------------------------------------------ + +package body Natools.Parallelism is + + procedure Single_Accumulator_Run + (Global : in out Global_State; + Task_Count : in Positive) + is + protected State is + procedure Initialize (Job : out Job_State; Continue : out Boolean); + procedure Next (Job : in out Job_State; Continue : out Boolean); + end State; + + task type Worker is + end Worker; + + protected body State is + + procedure Initialize (Job : out Job_State; Continue : out Boolean) is + begin + Continue := not Is_Finished (Global); + + if Continue then + Initialize_Job (Global, Job); + end if; + end Initialize; + + procedure Next (Job : in out Job_State; Continue : out Boolean) is + begin + Gather_Result (Global, Job); + Initialize (Job, Continue); + end Next; + + end State; + + task body Worker is + Job : Job_State; + Continue : Boolean; + begin + State.Initialize (Job, Continue); + + while Continue loop + Do_Job (Job); + State.Next (Job, Continue); + end loop; + end Worker; + + Workers : array (1 .. Task_Count) of Worker; + pragma Unreferenced (Workers); + begin + null; + end Single_Accumulator_Run; + +end Natools.Parallelism; ADDED src/natools-parallelism.ads Index: src/natools-parallelism.ads ================================================================== --- src/natools-parallelism.ads +++ src/natools-parallelism.ads @@ -0,0 +1,53 @@ +------------------------------------------------------------------------------ +-- Copyright (c) 2016, Natacha Porté -- +-- -- +-- Permission to use, copy, modify, and distribute this software for any -- +-- purpose with or without fee is hereby granted, provided that the above -- +-- copyright notice and this permission notice appear in all copies. -- +-- -- +-- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -- +-- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -- +-- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -- +-- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -- +-- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -- +-- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -- +-- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -- +------------------------------------------------------------------------------ + +------------------------------------------------------------------------------ +-- Natools.Parallelism provides generic procedures to help with simple -- +-- parallelisation needs. -- +------------------------------------------------------------------------------ + +package Natools.Parallelism is + pragma Pure; + + generic + type Global_State (<>) is limited private; + -- State common to all jobs, only accessed from protected subprograms + + type Job_State is limited private; + -- State of a single job, each worker task having its own + + with procedure Initialize_Job + (Global : in out Global_State; + Job : out Job_State) is <>; + -- Initialize Job and update Global as needed + + with procedure Do_Job (Job : in out Job_State) is <>; + -- Perform the job in parallel + + with procedure Gather_Result + (Global : in out Global_State; + Job : in Job_State) is <>; + -- Update Global with results stored in Job + + with function Is_Finished (Global : in Global_State) + return Boolean is <>; + -- Check whether there is still a job to do + + procedure Single_Accumulator_Run + (Global : in out Global_State; + Task_Count : in Positive); + +end Natools.Parallelism;