with Interfaces; package Agila_Ports is -- Original Open Agila implementation. Host identity values are supplied by -- trusted callers; a future syscall boundary must derive identity itself. subtype Word is Interfaces.Unsigned_32; Max_Ports : constant := 8; Queue_Capacity : constant := 4; type Status is (Ok, Invalid_Handle, Permission_Denied, Full, Empty, Exhausted, Invalid_Argument); type Message is record Sender : Word := 0; Value : Word := 0; end record; type Manager is limited private; procedure Create (State : in out Manager; Owner : Word; Handle : out Word; Result : out Status); procedure Allow_Sender (State : in out Manager; Handle, Owner, Sender : Word; Result : out Status); procedure Revoke_Sender (State : in out Manager; Handle, Owner, Sender : Word; Result : out Status); procedure Send (State : in out Manager; Handle, Caller, Value : Word; Result : out Status); procedure Receive (State : in out Manager; Handle, Caller : Word; Item : out Message; Result : out Status); procedure Close (State : in out Manager; Handle, Caller : Word; Result : out Status); private type Messages is array (Natural range 0 .. Queue_Capacity - 1) of Message; type Port is record Active : Boolean := False; Retired : Boolean := False; Generation : Word := 1; Owner : Word := 0; Allowed_Sender : Word := 0; Head : Natural range 0 .. Queue_Capacity - 1 := 0; Count : Natural range 0 .. Queue_Capacity := 0; Queue : Messages := [others => (0, 0)]; end record; type Ports is array (Natural range 0 .. Max_Ports - 1) of Port; type Manager is limited record Table : Ports; end record; end Agila_Ports;