44 lines
1.8 KiB
Ada
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;
|