with Locking_Objects; use Locking_Objects;
with Objects; use Objects;
with Processes; use Processes;
private with Ada.Containers.Doubly_Linked_Lists;
package Processes.Managers is
type Process_Manager is new Object with private;
type A_Process_Manager is access all Process_Manager'Class;
type A_Destructor is access procedure( process : in out A_Process );
function Create_Process_Manager( hertz : Natural := 0;
minHertz : Natural := 0 ) return A_Process_Manager;
pragma Postcondition( Create_Process_Manager'Result /= null );
procedure Attach( this : not null access Process_Manager'Class;
proc : not null A_Process );
procedure Detach( this : not null access Process_Manager'Class;
proc : not null A_Process;
destructor : A_Destructor := null );
function Get_Rate( this : not null access Process_Manager'Class ) return Natural;
procedure Pause( this : not null access Process_Manager'Class;
proc : not null A_Process;
paused : Boolean );
procedure Start( this : not null access Process_Manager'Class );
procedure Stop( this : not null access Process_Manager'Class );
procedure Track_Rate( this : not null access Process_Manager'Class;
enabled : Boolean );
procedure Delete( this : in out A_Process_Manager );
pragma Postcondition( this = null );
private
type Execution is
record
process : A_Process := null;
firstTick : Time := Time_First;
lastTick : Time := Time_First;
paused : Boolean := False;
pauseTime : Time := Time_First;
end record;
type A_Execution is access all Execution;
procedure Delete( exec : in out A_Execution );
function Eq( l, r : A_Execution ) return Boolean;
package Execution_Lists is new Ada.Containers.Doubly_Linked_Lists( A_Execution, Eq );
use Execution_Lists;
type Operation is abstract tagged
record
process : A_Process := null;
end record;
type A_Operation is access all Operation'Class;
procedure Execute( this : access Operation;
plist : in out Execution_Lists.List ) is abstract;
procedure Delete( this : in out A_Operation );
type Attach_Operation is new Operation with null record;
procedure Execute( this : access Attach_Operation;
execList : in out Execution_Lists.List );
type Detach_Operation is new Operation with
record
destroy : A_Destructor := null;
end record;
procedure Execute( this : access Detach_Operation;
execList : in out Execution_Lists.List );
type Pause_Operation is new Operation with null record;
procedure Execute( this : access Pause_Operation;
execList : in out Execution_Lists.List );
type Resume_Operation is new Operation with null record;
procedure Execute( this : access Resume_Operation;
execList : in out Execution_Lists.List );
function Create_Attach_Operation( process : not null A_Process ) return A_Operation;
function Create_Detach_Operation( process : not null A_Process;
destructor : A_Destructor ) return A_Operation;
function Create_Pause_Operation( process : not null A_Process ) return A_Operation;
function Create_Resume_Operation( process : not null A_Process ) return A_Operation;
package Operation_Lists is new Ada.Containers.Doubly_Linked_Lists( A_Operation, "=" );
task type Ticker_Task is
entry Init( pman : A_Process_Manager; hertz, minHertz : Natural );
entry Start;
entry Stop;
end Ticker_Task;
type A_Ticker_Task is access all Ticker_Task;
procedure Delete( ticker : in out A_Ticker_Task );
type Process_Manager is new Object with
record
lock : A_Locking_Object;
operations : Operation_Lists.List;
trackRate : Boolean := False;
rate : Natural := 0;
ticker : A_Ticker_Task := null;
end record;
procedure Adjust( this : access Process_Manager );
procedure Construct( this : access Process_Manager;
hertz : Natural;
minHertz : Natural );
procedure Delete( this : in out Process_Manager );
end Processes.Managers;