Files

44 lines
1.8 KiB
Ada

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;