lace.events: Add event sequence to ensure events are processed in order.
This commit is contained in:
@@ -33,7 +33,7 @@ is
|
|||||||
private
|
private
|
||||||
use ada.Strings.unbounded;
|
use ada.Strings.unbounded;
|
||||||
|
|
||||||
pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
-- pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
||||||
|
|
||||||
|
|
||||||
package Observer is new event.make_Observer (Any.limited_item);
|
package Observer is new event.make_Observer (Any.limited_item);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ is
|
|||||||
private
|
private
|
||||||
use ada.Strings.unbounded;
|
use ada.Strings.unbounded;
|
||||||
|
|
||||||
pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
-- pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
||||||
|
|
||||||
|
|
||||||
package Observer is new event.make_Observer (Any.limited_item);
|
package Observer is new event.make_Observer (Any.limited_item);
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ private
|
|||||||
|
|
||||||
use ada.Strings.unbounded;
|
use ada.Strings.unbounded;
|
||||||
|
|
||||||
pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
-- pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
||||||
|
|
||||||
|
|
||||||
package Subject is new event.make_Subject (Any.limited_item);
|
package Subject is new event.make_Subject (Any.limited_item);
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ is
|
|||||||
private
|
private
|
||||||
use ada.Strings.unbounded;
|
use ada.Strings.unbounded;
|
||||||
|
|
||||||
pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
-- pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
||||||
|
|
||||||
|
|
||||||
package Subject is new event.make_Subject (Any.limited_item);
|
package Subject is new event.make_Subject (Any.limited_item);
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ is
|
|||||||
private
|
private
|
||||||
use ada.Strings.unbounded;
|
use ada.Strings.unbounded;
|
||||||
|
|
||||||
pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
-- pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
||||||
|
|
||||||
|
|
||||||
package Subject is new event.make_Subject (Any.limited_item);
|
package Subject is new event.make_Subject (Any.limited_item);
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ is
|
|||||||
is
|
is
|
||||||
begin
|
begin
|
||||||
Self.Responses.add (Self, the_Response, to_Kind, from_Subject);
|
Self.Responses.add (Self, the_Response, to_Kind, from_Subject);
|
||||||
|
|
||||||
|
if not Self.sequence_Id_Map.contains (from_Subject)
|
||||||
|
then
|
||||||
|
Self.sequence_Id_Map.insert (from_Subject, 0);
|
||||||
|
end if;
|
||||||
end add;
|
end add;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ with
|
|||||||
|
|
||||||
private
|
private
|
||||||
with
|
with
|
||||||
|
lace.event.Containers,
|
||||||
ada.Containers.indefinite_hashed_Maps,
|
ada.Containers.indefinite_hashed_Maps,
|
||||||
ada.Strings.Hash;
|
ada.Strings.Hash;
|
||||||
|
|
||||||
@@ -57,7 +58,7 @@ is
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
-- pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
||||||
|
|
||||||
|
|
||||||
----------------------
|
----------------------
|
||||||
@@ -135,7 +136,8 @@ private
|
|||||||
and Observer.item
|
and Observer.item
|
||||||
with
|
with
|
||||||
record
|
record
|
||||||
Responses : safe_Responses;
|
Responses : safe_Responses;
|
||||||
|
sequence_Id_Map : Containers.name_Map_of_sequence_Id; -- Contains the next expected sequence ID from each subject.
|
||||||
end record;
|
end record;
|
||||||
|
|
||||||
end lace.event.make_Observer;
|
end lace.event.make_Observer;
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ is
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
pragma suppress (container_Checks); -- Suppress expensive tamper checks.
|
-- pragma suppress (container_Checks); -- Suppress expensive tamper checks.
|
||||||
|
|
||||||
|
|
||||||
--------------------------
|
--------------------------
|
||||||
@@ -144,7 +144,7 @@ private
|
|||||||
with
|
with
|
||||||
record
|
record
|
||||||
safe_Observers : make_Subject.safe_Observers;
|
safe_Observers : make_Subject.safe_Observers;
|
||||||
sequence_Id_Map : Containers.safe_sequence_Id_Map;
|
sequence_Id_Map : Containers.safe_sequence_Id_Map; -- Contains the next send sequence ID for each observer.
|
||||||
Emitter : event_Emitter_view;
|
Emitter : event_Emitter_view;
|
||||||
Sender : event_Sender_view;
|
Sender : event_Sender_view;
|
||||||
end record;
|
end record;
|
||||||
|
|||||||
@@ -34,6 +34,14 @@ is
|
|||||||
next_Id := next_Id + 1;
|
next_Id := next_Id + 1;
|
||||||
end get_Next;
|
end get_Next;
|
||||||
|
|
||||||
|
|
||||||
|
procedure decrement (for_Name : in String)
|
||||||
|
is
|
||||||
|
next_Id : name_Maps_of_sequence_Id.Reference_type renames the_Map (for_Name);
|
||||||
|
begin
|
||||||
|
next_Id := next_Id - 1;
|
||||||
|
end decrement;
|
||||||
|
|
||||||
end safe_sequence_Id_Map;
|
end safe_sequence_Id_Map;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
with
|
with
|
||||||
ada.Strings.Hash,
|
ada.Strings.Hash,
|
||||||
ada.Containers.indefinite_hashed_Maps;
|
ada.Containers.indefinite_hashed_Maps,
|
||||||
|
ada.Containers.indefinite_Holders;
|
||||||
|
|
||||||
|
|
||||||
private
|
-- private
|
||||||
package lace.event.Containers
|
package lace.event.Containers
|
||||||
--
|
--
|
||||||
-- Common containers.
|
-- Common containers.
|
||||||
@@ -13,6 +14,13 @@ is
|
|||||||
pragma suppress (container_Checks); -- Suppress expensive tamper checks.
|
pragma suppress (container_Checks); -- Suppress expensive tamper checks.
|
||||||
|
|
||||||
|
|
||||||
|
----------------
|
||||||
|
-- Event holder.
|
||||||
|
--
|
||||||
|
package event_Holders is new ada.Containers.indefinite_Holders (Event.item'Class);
|
||||||
|
subtype event_Holder is event_Holders.Holder;
|
||||||
|
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
-- Name map of sequence Id.
|
-- Name map of sequence Id.
|
||||||
--
|
--
|
||||||
@@ -32,8 +40,10 @@ is
|
|||||||
procedure add (Name : in String);
|
procedure add (Name : in String);
|
||||||
procedure rid (Name : in String);
|
procedure rid (Name : in String);
|
||||||
|
|
||||||
procedure get_Next (Id : out event.sequence_Id;
|
procedure get_Next (Id : out event.sequence_Id;
|
||||||
for_Name : in String);
|
for_Name : in String);
|
||||||
|
procedure decrement (for_Name : in String);
|
||||||
|
|
||||||
private
|
private
|
||||||
the_Map : name_Map_of_sequence_Id;
|
the_Map : name_Map_of_sequence_Id;
|
||||||
end safe_sequence_Id_Map;
|
end safe_sequence_Id_Map;
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
with
|
with
|
||||||
lace.Observer,
|
lace.Observer,
|
||||||
|
lace.Event.Containers,
|
||||||
lace.Event.utility,
|
lace.Event.utility,
|
||||||
|
|
||||||
ada.Text_IO,
|
ada.Text_IO,
|
||||||
ada.Exceptions,
|
ada.Exceptions,
|
||||||
ada.unchecked_Deallocation;
|
ada.unchecked_Deallocation,
|
||||||
|
ada.Containers.Vectors;
|
||||||
|
|
||||||
|
|
||||||
package body lace.event_Emitter
|
package body lace.event_Emitter
|
||||||
@@ -64,7 +66,7 @@ is
|
|||||||
is
|
is
|
||||||
Myself : Emitter_view;
|
Myself : Emitter_view;
|
||||||
s_Id : event.sequence_Id;
|
s_Id : event.sequence_Id;
|
||||||
Event : event_Holder;
|
Event : lace.event.Containers.event_Holder;
|
||||||
the_Observer : lace.Observer.view;
|
the_Observer : lace.Observer.view;
|
||||||
subject_Name : string_Holder;
|
subject_Name : string_Holder;
|
||||||
emitter_Pool : safe_Emitters_view;
|
emitter_Pool : safe_Emitters_view;
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ with
|
|||||||
private
|
private
|
||||||
with
|
with
|
||||||
lace.Subject,
|
lace.Subject,
|
||||||
|
lace.event.Containers,
|
||||||
ada.Containers.indefinite_Holders,
|
ada.Containers.indefinite_Holders,
|
||||||
ada.Containers.indefinite_Vectors,
|
ada.Containers.indefinite_Vectors;
|
||||||
ada.Containers.Vectors;
|
|
||||||
|
|
||||||
|
|
||||||
private
|
private
|
||||||
@@ -39,22 +39,13 @@ private
|
|||||||
---------------
|
---------------
|
||||||
--- Containers.
|
--- Containers.
|
||||||
--
|
--
|
||||||
use type Event.item'Class;
|
-- use type Event.item'Class;
|
||||||
package event_Holders is new ada.Containers.Indefinite_Holders (Event.item'Class);
|
-- package event_Holders is new ada.Containers.Indefinite_Holders (Event.item'Class);
|
||||||
subtype event_Holder is event_Holders.Holder;
|
-- subtype event_Holder is event_Holders.Holder;
|
||||||
|
|
||||||
|
|
||||||
-- type event_Details is
|
|
||||||
-- record
|
|
||||||
-- Sequence : event.sequence_Id;
|
|
||||||
-- Event : event_Holder;
|
|
||||||
-- end record;
|
|
||||||
|
|
||||||
|
|
||||||
|
use type lace.Event.item'Class;
|
||||||
package event_Vectors is new ada.Containers.indefinite_Vectors (Positive,
|
package event_Vectors is new ada.Containers.indefinite_Vectors (Positive,
|
||||||
lace.Event.item'Class);
|
lace.Event.item'Class);
|
||||||
-- package event_Vectors is new ada.Containers.Vectors (Positive,
|
|
||||||
-- event_Details);
|
|
||||||
subtype event_Vector is event_Vectors.Vector;
|
subtype event_Vector is event_Vectors.Vector;
|
||||||
|
|
||||||
|
|
||||||
@@ -67,7 +58,6 @@ private
|
|||||||
type safe_Events
|
type safe_Events
|
||||||
is
|
is
|
||||||
procedure add (new_Event : in lace.Event.item'Class);
|
procedure add (new_Event : in lace.Event.item'Class);
|
||||||
-- Sequence : in event.sequence_Id);
|
|
||||||
procedure get (the_Events : out event_Vector);
|
procedure get (the_Events : out event_Vector);
|
||||||
|
|
||||||
function is_Empty return Boolean;
|
function is_Empty return Boolean;
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ with
|
|||||||
lace.Event.utility,
|
lace.Event.utility,
|
||||||
ada.unchecked_Deallocation;
|
ada.unchecked_Deallocation;
|
||||||
|
|
||||||
|
with ada.Text_IO; use ada.Text_IO;
|
||||||
|
|
||||||
|
|
||||||
package body lace.event.make_Observer.deferred
|
package body lace.event.make_Observer.deferred
|
||||||
is
|
is
|
||||||
@@ -28,10 +30,13 @@ is
|
|||||||
Sequence : in sequence_Id)
|
Sequence : in sequence_Id)
|
||||||
is
|
is
|
||||||
begin
|
begin
|
||||||
Self.pending_Events.add (the_Event, from_Subject);
|
Self.pending_Events.add (the_Event,
|
||||||
|
Sequence,
|
||||||
|
from_Subject);
|
||||||
end receive;
|
end receive;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
overriding
|
overriding
|
||||||
procedure respond (Self : access Item)
|
procedure respond (Self : access Item)
|
||||||
is
|
is
|
||||||
@@ -44,7 +49,8 @@ is
|
|||||||
the_Events : in Event_Vector;
|
the_Events : in Event_Vector;
|
||||||
from_subject_Name : in Event.subject_Name)
|
from_subject_Name : in Event.subject_Name)
|
||||||
is
|
is
|
||||||
Cursor : Event_Vectors.Cursor := the_Events.First;
|
expected_Sequence : Containers.name_Maps_of_sequence_Id.Reference_type renames Self.sequence_Id_Map (from_subject_Name);
|
||||||
|
Cursor : Event_Vectors.Cursor := the_Events.First;
|
||||||
begin
|
begin
|
||||||
while has_Element (Cursor)
|
while has_Element (Cursor)
|
||||||
loop
|
loop
|
||||||
@@ -54,45 +60,59 @@ is
|
|||||||
ada.Containers;
|
ada.Containers;
|
||||||
use type Observer.view;
|
use type Observer.view;
|
||||||
|
|
||||||
the_Event : constant Event.item'Class := Element (Cursor);
|
the_Event : constant Event.item'Class := Element (Cursor).Event.Element;
|
||||||
Response : constant event_response_Maps.Cursor := the_Responses.find (to_Kind (the_Event'Tag));
|
the_Sequence : constant sequence_Id := Element (Cursor).Sequence;
|
||||||
|
Response : constant event_response_Maps.Cursor := the_Responses.find (to_Kind (the_Event'Tag));
|
||||||
|
|
||||||
begin
|
begin
|
||||||
if has_Element (Response)
|
-- put_Line ("observer " & my_Name & " from " & from_subject_Name & " seq" & the_Sequence'Image & " exp seq " & sequence_Id' (expected_Sequence)'Image);
|
||||||
|
|
||||||
|
if the_Sequence = expected_Sequence
|
||||||
then
|
then
|
||||||
Element (Response).respond (the_Event);
|
expected_Sequence := expected_Sequence + 1;
|
||||||
|
|
||||||
if Observer.Logger /= null
|
if has_Element (Response)
|
||||||
then
|
then
|
||||||
Observer.Logger.log_Response (Element (Response),
|
Element (Response).respond (the_Event);
|
||||||
Observer.view (Self),
|
|
||||||
the_Event,
|
|
||||||
from_subject_Name);
|
|
||||||
end if;
|
|
||||||
|
|
||||||
elsif Self.Responses.relay_Target /= null
|
if Observer.Logger /= null
|
||||||
then
|
then
|
||||||
-- Self.relay_Target.notify (the_Event, from_Subject_Name); -- todo: Re-enable relayed events.
|
Observer.Logger.log_Response (Element (Response),
|
||||||
|
Observer.view (Self),
|
||||||
|
the_Event,
|
||||||
|
from_subject_Name);
|
||||||
|
end if;
|
||||||
|
|
||||||
if Observer.Logger /= null
|
elsif Self.Responses.relay_Target /= null
|
||||||
then
|
then
|
||||||
Observer.Logger.log ("[Warning] ~ Relayed events are currently disabled.");
|
-- Self.relay_Target.notify (the_Event, from_Subject_Name); -- todo: Re-enable relayed events.
|
||||||
|
|
||||||
|
if Observer.Logger /= null
|
||||||
|
then
|
||||||
|
Observer.Logger.log ("[Warning] ~ Relayed events are currently disabled.");
|
||||||
|
else
|
||||||
|
raise program_Error with "Event relaying is currently disabled.";
|
||||||
|
end if;
|
||||||
|
|
||||||
else
|
else
|
||||||
raise program_Error with "Event relaying is currently disabled.";
|
if Observer.Logger /= null
|
||||||
|
then
|
||||||
|
Observer.Logger.log ("[Warning] ~ Observer "
|
||||||
|
& my_Name
|
||||||
|
& " has no response to " & Name_of (the_Event)
|
||||||
|
& " from " & from_subject_Name & ".");
|
||||||
|
Observer.Logger.log (" Count of responses =>"
|
||||||
|
& the_Responses.Length'Image);
|
||||||
|
else
|
||||||
|
raise program_Error with "Observer " & my_Name & " has no response to " & Name_of (the_Event)
|
||||||
|
& " from " & from_subject_Name & ".";
|
||||||
|
end if;
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
else
|
else
|
||||||
if Observer.Logger /= null
|
Self.receive (the_Event => the_Event, -- Return the event to the event queue for later processing,
|
||||||
then
|
from_Subject => from_subject_Name, -- after the missing sequence event has arrived.
|
||||||
Observer.Logger.log ("[Warning] ~ Observer "
|
Sequence => the_Sequence);
|
||||||
& my_Name
|
|
||||||
& " has no response to " & Name_of (the_Event)
|
|
||||||
& " from " & from_subject_Name & ".");
|
|
||||||
Observer.Logger.log (" Count of responses =>"
|
|
||||||
& the_Responses.Length'Image);
|
|
||||||
else
|
|
||||||
raise program_Error with "Observer " & my_Name & " has no response to " & Name_of (the_Event)
|
|
||||||
& " from " & from_subject_Name & ".";
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -103,26 +123,23 @@ is
|
|||||||
|
|
||||||
the_subject_Events : constant subject_events_Pairs := Self.pending_Events.fetch;
|
the_subject_Events : constant subject_events_Pairs := Self.pending_Events.fetch;
|
||||||
|
|
||||||
-- the_subject_Events : subject_events_Pairs (1 .. 5_000);
|
|
||||||
-- Count : Natural;
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
-- Self.pending_Events.fetch (the_subject_Events, Count);
|
|
||||||
|
|
||||||
-- for i in 1 .. Count
|
|
||||||
for i in the_subject_Events'Range
|
for i in the_subject_Events'Range
|
||||||
loop
|
loop
|
||||||
declare
|
declare
|
||||||
|
function Less_than (L, R : in event_sequence_Pair) return Boolean is (L.Sequence < R.Sequence);
|
||||||
|
package Sorter is new event_Vectors.generic_Sorting ("<" => Less_than);
|
||||||
procedure deallocate is new ada.unchecked_Deallocation (String, String_view);
|
procedure deallocate is new ada.unchecked_Deallocation (String, String_view);
|
||||||
|
|
||||||
subject_Name : String_view := the_subject_Events (i).Subject;
|
subject_Name : String_view := the_subject_Events (i).Subject;
|
||||||
the_Events : Event_vector renames the_subject_Events (i).Events;
|
the_Events : Event_vector := the_subject_Events (i).Events;
|
||||||
begin
|
begin
|
||||||
if Self.Responses.contains (subject_Name.all)
|
if Self.Responses.contains (subject_Name.all)
|
||||||
then
|
then
|
||||||
actuate (Self.Responses.Element (subject_Name.all),
|
Sorter.sort (the_Events);
|
||||||
the_Events,
|
actuate (Self.Responses.Element (subject_Name.all),
|
||||||
subject_Name.all);
|
the_Events,
|
||||||
|
subject_Name.all);
|
||||||
else
|
else
|
||||||
declare
|
declare
|
||||||
Message : constant String := "*** Warning *** ~ " & my_Name & " has no responses for events from " & subject_Name.all & ".";
|
Message : constant String := "*** Warning *** ~ " & my_Name & " has no responses for events from " & subject_Name.all & ".";
|
||||||
@@ -149,10 +166,13 @@ is
|
|||||||
protected
|
protected
|
||||||
body safe_Events
|
body safe_Events
|
||||||
is
|
is
|
||||||
procedure add (the_Event : in Event.item'Class)
|
procedure add (the_Event : in Event.item'Class;
|
||||||
|
Sequence : in sequence_Id)
|
||||||
is
|
is
|
||||||
|
use Containers.event_Holders;
|
||||||
begin
|
begin
|
||||||
the_Events.append (the_Event);
|
the_Events.append (event_sequence_Pair' (to_Holder (the_Event),
|
||||||
|
Sequence));
|
||||||
end add;
|
end add;
|
||||||
|
|
||||||
|
|
||||||
@@ -172,6 +192,7 @@ is
|
|||||||
body safe_subject_Map_of_safe_events
|
body safe_subject_Map_of_safe_events
|
||||||
is
|
is
|
||||||
procedure add (the_Event : in Event.item'Class;
|
procedure add (the_Event : in Event.item'Class;
|
||||||
|
Sequence : in sequence_Id;
|
||||||
from_Subject : in String)
|
from_Subject : in String)
|
||||||
is
|
is
|
||||||
begin
|
begin
|
||||||
@@ -181,7 +202,8 @@ is
|
|||||||
new safe_Events);
|
new safe_Events);
|
||||||
end if;
|
end if;
|
||||||
|
|
||||||
the_Map.Element (from_Subject).add (the_Event);
|
the_Map.Element (from_Subject).add (the_Event,
|
||||||
|
Sequence);
|
||||||
end add;
|
end add;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
private
|
private
|
||||||
with
|
with
|
||||||
ada.Containers.indefinite_Vectors,
|
lace.Event.Containers,
|
||||||
|
ada.Containers.Vectors,
|
||||||
ada.Containers.indefinite_hashed_Maps,
|
ada.Containers.indefinite_hashed_Maps,
|
||||||
ada.Strings.Hash;
|
ada.Strings.Hash;
|
||||||
|
|
||||||
@@ -38,12 +39,20 @@ is
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
-- pragma Suppress (Container_Checks); -- Suppress expensive tamper checks.
|
||||||
|
|
||||||
|
|
||||||
|
type event_sequence_Pair is
|
||||||
|
record
|
||||||
|
Event : Containers.event_Holder;
|
||||||
|
Sequence : sequence_Id;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
|
||||||
----------------
|
----------------
|
||||||
-- Event Vectors
|
-- Event Vectors
|
||||||
--
|
--
|
||||||
package event_Vectors is new ada.Containers.indefinite_Vectors (Positive, Event.item'Class);
|
package event_Vectors is new ada.Containers.Vectors (Positive, event_sequence_Pair);
|
||||||
subtype event_Vector is event_Vectors.Vector;
|
subtype event_Vector is event_Vectors.Vector;
|
||||||
type event_Vector_view is access all event_Vector;
|
type event_Vector_view is access all event_Vector;
|
||||||
|
|
||||||
@@ -54,7 +63,8 @@ private
|
|||||||
protected
|
protected
|
||||||
type safe_Events
|
type safe_Events
|
||||||
is
|
is
|
||||||
procedure add (the_Event : in Event.item'Class);
|
procedure add (the_Event : in Event.item'Class;
|
||||||
|
Sequence : in sequence_Id);
|
||||||
procedure fetch (all_Events : out event_Vector);
|
procedure fetch (all_Events : out event_Vector);
|
||||||
private
|
private
|
||||||
the_Events : event_Vector;
|
the_Events : event_Vector;
|
||||||
@@ -95,6 +105,7 @@ private
|
|||||||
type safe_subject_Map_of_safe_events
|
type safe_subject_Map_of_safe_events
|
||||||
is
|
is
|
||||||
procedure add (the_Event : in Event.item'Class;
|
procedure add (the_Event : in Event.item'Class;
|
||||||
|
Sequence : in sequence_Id;
|
||||||
from_Subject : in String);
|
from_Subject : in String);
|
||||||
|
|
||||||
function fetch return subject_events_Pairs;
|
function fetch return subject_events_Pairs;
|
||||||
|
|||||||
Reference in New Issue
Block a user