lace: Add basic job manager.
This commit is contained in:
49
1-base/lace/applet/test/job/test_job.adb
Normal file
49
1-base/lace/applet/test/job/test_job.adb
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
with
|
||||||
|
lace.Job.Manager,
|
||||||
|
ada.Calendar,
|
||||||
|
ada.Text_IO;
|
||||||
|
|
||||||
|
|
||||||
|
procedure test_Job
|
||||||
|
is
|
||||||
|
procedure log (Message : in String := "") renames ada.Text_IO.put_Line;
|
||||||
|
|
||||||
|
|
||||||
|
type hello_Job is new lace.Job.item with null record;
|
||||||
|
|
||||||
|
overriding
|
||||||
|
procedure perform (Self : in out hello_Job)
|
||||||
|
is
|
||||||
|
use ada.Calendar;
|
||||||
|
begin
|
||||||
|
lace.Job.item (Self).perform; -- Call base class 'perform'.
|
||||||
|
|
||||||
|
log ("Hello.");
|
||||||
|
|
||||||
|
if Self.performed_Count = 5
|
||||||
|
then
|
||||||
|
Self.Due_is (lace.Job.Never); -- Job manager will remove the job.
|
||||||
|
else
|
||||||
|
Self.Due_is (Self.Due + 2.0); -- Repeat job every 2 seconds.
|
||||||
|
end if;
|
||||||
|
end perform;
|
||||||
|
|
||||||
|
|
||||||
|
the_Job : aliased hello_Job;
|
||||||
|
the_Manager : lace.Job.Manager.item;
|
||||||
|
|
||||||
|
begin
|
||||||
|
log ("Begin Test");
|
||||||
|
log;
|
||||||
|
|
||||||
|
the_Job.Due_is (ada.Calendar.Clock);
|
||||||
|
the_Manager.add (the_Job'unchecked_Access);
|
||||||
|
|
||||||
|
while the_Manager.has_Jobs
|
||||||
|
loop
|
||||||
|
the_Manager.do_Jobs;
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
log;
|
||||||
|
log ("End Test");
|
||||||
|
end test_Job;
|
||||||
19
1-base/lace/applet/test/job/test_job.gpr
Normal file
19
1-base/lace/applet/test/job/test_job.gpr
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
with
|
||||||
|
"lace",
|
||||||
|
"lace_shared";
|
||||||
|
|
||||||
|
project test_Job
|
||||||
|
is
|
||||||
|
for Object_Dir use "build";
|
||||||
|
for Exec_Dir use ".";
|
||||||
|
for Main use ("test_job.adb");
|
||||||
|
|
||||||
|
package Builder renames Lace_shared.Builder;
|
||||||
|
package Compiler renames Lace_shared.Compiler;
|
||||||
|
package Binder renames Lace_shared.Binder;
|
||||||
|
|
||||||
|
package Linker is
|
||||||
|
for Default_Switches ("ada") use ("-g");
|
||||||
|
end Linker;
|
||||||
|
|
||||||
|
end test_Job;
|
||||||
63
1-base/lace/source/jobs/lace-job-manager.adb
Normal file
63
1-base/lace/source/jobs/lace-job-manager.adb
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
with ada.Text_IO; use ada.Text_IO;
|
||||||
|
|
||||||
|
|
||||||
|
package body lace.Job.Manager
|
||||||
|
is
|
||||||
|
|
||||||
|
|
||||||
|
procedure add (Self : in out Item; the_Job: in Job_view)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Self.Jobs.append (the_Job);
|
||||||
|
end add;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function has_Jobs (Self : in Item) return Boolean
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
return not Self.Jobs.is_Empty;
|
||||||
|
end has_Jobs;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
procedure do_Jobs (Self : in out Item)
|
||||||
|
is
|
||||||
|
function "<" (Left, Right : in Job_view) return Boolean
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
return Left.Due < Right.Due;
|
||||||
|
end "<";
|
||||||
|
|
||||||
|
package Sorter is new job_Vectors.generic_Sorting;
|
||||||
|
|
||||||
|
|
||||||
|
Now : constant ada.Calendar.Time := ada.Calendar.Clock;
|
||||||
|
Cursor : job_Vectors.Cursor := Self.Jobs.to_Cursor (1);
|
||||||
|
|
||||||
|
use job_Vectors;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Sorter.sort (Self.Jobs);
|
||||||
|
|
||||||
|
while has_Element (Cursor)
|
||||||
|
loop
|
||||||
|
declare
|
||||||
|
the_Job : Job_view renames Element (Cursor);
|
||||||
|
begin
|
||||||
|
exit when the_Job.Due > Now;
|
||||||
|
-- put_Line (the_Job.Due'Image);
|
||||||
|
|
||||||
|
if the_Job.Due = Never
|
||||||
|
then
|
||||||
|
Self.Jobs.delete (Cursor);
|
||||||
|
else
|
||||||
|
the_Job.perform;
|
||||||
|
end if;
|
||||||
|
end;
|
||||||
|
end loop;
|
||||||
|
end do_Jobs;
|
||||||
|
|
||||||
|
|
||||||
|
end lace.Job.Manager;
|
||||||
33
1-base/lace/source/jobs/lace-job-manager.ads
Normal file
33
1-base/lace/source/jobs/lace-job-manager.ads
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
with
|
||||||
|
ada.Containers.Vectors;
|
||||||
|
|
||||||
|
|
||||||
|
package lace.Job.Manager
|
||||||
|
--
|
||||||
|
--
|
||||||
|
--
|
||||||
|
is
|
||||||
|
type Item is tagged private;
|
||||||
|
type Job_view is access all Job.item'Class;
|
||||||
|
|
||||||
|
|
||||||
|
procedure add (Self : in out Item; the_Job: in Job_view);
|
||||||
|
procedure do_Jobs (Self : in out Item);
|
||||||
|
|
||||||
|
function has_Jobs (Self : in Item) return Boolean;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
package job_Vectors is new ada.Containers.Vectors (Positive, Job_view);
|
||||||
|
subtype job_Vector is job_Vectors.Vector;
|
||||||
|
|
||||||
|
|
||||||
|
type Item is tagged
|
||||||
|
record
|
||||||
|
Jobs : job_Vector;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
|
||||||
|
end lace.Job.Manager;
|
||||||
35
1-base/lace/source/jobs/lace-job.adb
Normal file
35
1-base/lace/source/jobs/lace-job.adb
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package body lace.Job
|
||||||
|
is
|
||||||
|
|
||||||
|
procedure Due_is (Self : in out Item; Now : in ada.Calendar.Time)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Self.Due := Now;
|
||||||
|
end Due_is;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function Due (Self : in Item) return ada.Calendar.Time
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
return Self.Due;
|
||||||
|
end Due;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function performed_Count (Self : in Item) return Natural
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
return Self.performed_Count;
|
||||||
|
end performed_Count;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
procedure perform (Self : in out Item)
|
||||||
|
is
|
||||||
|
begin
|
||||||
|
Self.performed_Count := Self.performed_Count + 1;
|
||||||
|
end perform;
|
||||||
|
|
||||||
|
|
||||||
|
end lace.Job;
|
||||||
42
1-base/lace/source/jobs/lace-job.ads
Normal file
42
1-base/lace/source/jobs/lace-job.ads
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
with
|
||||||
|
ada.Calendar;
|
||||||
|
|
||||||
|
|
||||||
|
package lace.Job
|
||||||
|
--
|
||||||
|
--
|
||||||
|
--
|
||||||
|
is
|
||||||
|
type Item is abstract tagged private;
|
||||||
|
|
||||||
|
procedure perform (Self : in out Item);
|
||||||
|
|
||||||
|
|
||||||
|
procedure Due_is (Self : in out Item; Now : in ada.Calendar.Time);
|
||||||
|
function Due (Self : in Item) return ada.Calendar.Time;
|
||||||
|
|
||||||
|
function performed_Count (Self : in Item) return Natural;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Never : constant ada.Calendar.Time;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
type Item is abstract tagged
|
||||||
|
record
|
||||||
|
Due : ada.Calendar.Time;
|
||||||
|
performed_Count : Natural := 0;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
use ada.Calendar;
|
||||||
|
|
||||||
|
Never : constant ada.Calendar.Time := ada.Calendar.Time_of (year_Number 'First,
|
||||||
|
month_Number'First,
|
||||||
|
day_Number 'First);
|
||||||
|
|
||||||
|
end lace.Job;
|
||||||
Reference in New Issue
Block a user