-- needed to accomplish locking per Interrupt base. Also is needed to
-- decide whether to create a new Server_Task.
- -- Type and Head, Tail of the list containing Registered Interrupt
- -- Handlers. These definitions are used to register the handlers
- -- specified by the pragma Interrupt_Handler.
+ -- Type and the list containing Registered Interrupt Handlers. These
+ -- definitions are used to register the handlers specified by the pragma
+ -- Interrupt_Handler.
+
+ --------------------------
+ -- Handler Registration --
+ --------------------------
type Registered_Handler;
type R_Link is access all Registered_Handler;
type Registered_Handler is record
- H : System.Address := System.Null_Address;
- Next : R_Link := null;
+ H : System.Address;
+ Next : R_Link;
end record;
- Registered_Handler_Head : R_Link := null;
- Registered_Handler_Tail : R_Link := null;
+ Registered_Handlers : R_Link := null;
Access_Hold : Server_Task_Access;
-- Variable used to allocate Server_Task using "new"
is
Interrupt : constant Interrupt_ID :=
Interrupt_ID (Storage_Elements.To_Integer (Int_Ref));
-
begin
if Is_Reserved (Interrupt) then
raise Program_Error with
-------------------
function Is_Registered (Handler : Parameterless_Handler) return Boolean is
+ Ptr : R_Link := Registered_Handlers;
type Acc_Proc is access procedure;
function To_Fat_Ptr is new Ada.Unchecked_Conversion
(Parameterless_Handler, Fat_Ptr);
- Ptr : R_Link;
Fat : Fat_Ptr;
begin
Fat := To_Fat_Ptr (Handler);
- Ptr := Registered_Handler_Head;
while Ptr /= null loop
if Ptr.H = Fat.Handler_Addr.all'Address then
return True;
---------------------------------
procedure Register_Interrupt_Handler (Handler_Addr : System.Address) is
- New_Node_Ptr : R_Link;
-
begin
-- This routine registers the Handler as usable for Dynamic Interrupt
-- Handler. Routines attaching and detaching Handler dynamically should
pragma Assert (Handler_Addr /= System.Null_Address);
- New_Node_Ptr := new Registered_Handler;
- New_Node_Ptr.H := Handler_Addr;
-
- if Registered_Handler_Head = null then
- Registered_Handler_Head := New_Node_Ptr;
- Registered_Handler_Tail := New_Node_Ptr;
-
- else
- Registered_Handler_Tail.Next := New_Node_Ptr;
- Registered_Handler_Tail := New_Node_Ptr;
- end if;
+ Registered_Handlers :=
+ new Registered_Handler'(H => Handler_Addr, Next => Registered_Handlers);
end Register_Interrupt_Handler;
-----------------------
pragma Volatile_Components (User_Entry);
-- Holds the task and entry index (if any) for each interrupt
- -- Type and Head, Tail of the list containing Registered Interrupt
- -- Handlers. These definitions are used to register the handlers
- -- specified by the pragma Interrupt_Handler.
+ -- Type and the list containing Registered Interrupt Handlers. These
+ -- definitions are used to register the handlers specified by the pragma
+ -- Interrupt_Handler.
+
+ --------------------------
+ -- Handler Registration --
+ --------------------------
type Registered_Handler;
type R_Link is access all Registered_Handler;
type Registered_Handler is record
- H : System.Address := System.Null_Address;
- Next : R_Link := null;
+ H : System.Address;
+ Next : R_Link;
end record;
- Registered_Handler_Head : R_Link := null;
- Registered_Handler_Tail : R_Link := null;
+ Registered_Handlers : R_Link := null;
Server_ID : array (Interrupt_ID) of System.Tasking.Task_Id :=
(others => System.Tasking.Null_Task);
-------------------
function Is_Registered (Handler : Parameterless_Handler) return Boolean is
+ Ptr : R_Link := Registered_Handlers;
type Acc_Proc is access procedure;
function To_Fat_Ptr is new Ada.Unchecked_Conversion
(Parameterless_Handler, Fat_Ptr);
- Ptr : R_Link;
Fat : Fat_Ptr;
begin
Fat := To_Fat_Ptr (Handler);
- Ptr := Registered_Handler_Head;
while Ptr /= null loop
if Ptr.H = Fat.Handler_Addr.all'Address then
return True;
--------------------------------
procedure Register_Interrupt_Handler (Handler_Addr : System.Address) is
- New_Node_Ptr : R_Link;
-
begin
-- This routine registers a handler as usable for dynamic interrupt
-- handler association. Routines attaching and detaching handlers
pragma Assert (Handler_Addr /= System.Null_Address);
- New_Node_Ptr := new Registered_Handler;
- New_Node_Ptr.H := Handler_Addr;
-
- if Registered_Handler_Head = null then
- Registered_Handler_Head := New_Node_Ptr;
- Registered_Handler_Tail := New_Node_Ptr;
- else
- Registered_Handler_Tail.Next := New_Node_Ptr;
- Registered_Handler_Tail := New_Node_Ptr;
- end if;
+ Registered_Handlers :=
+ new Registered_Handler'(H => Handler_Addr, Next => Registered_Handlers);
end Register_Interrupt_Handler;
-----------------------
pragma Convention (C, Signal_Handler);
-- This procedure is used to handle all the signals
- -- Type and Head, Tail of the list containing Registered Interrupt
- -- Handlers. These definitions are used to register the handlers
- -- specified by the pragma Interrupt_Handler.
+ -- Type and the list containing Registered Interrupt Handlers. These
+ -- definitions are used to register the handlers specified by the pragma
+ -- Interrupt_Handler.
--------------------------
-- Handler Registration --
type R_Link is access all Registered_Handler;
type Registered_Handler is record
- H : System.Address := System.Null_Address;
- Next : R_Link := null;
+ H : System.Address;
+ Next : R_Link;
end record;
Registered_Handlers : R_Link := null;
procedure Register_Interrupt_Handler (Handler_Addr : System.Address) is
begin
+ -- This routine registers a handler as usable for dynamic interrupt
+ -- handler association. Routines attaching and detaching handlers
+ -- dynamically should determine whether the handler is registered.
+ -- Program_Error should be raised if it is not registered.
+
+ -- Pragma Interrupt_Handler can only appear in a library level PO
+ -- definition and instantiation. Therefore, we do not need to implement
+ -- an unregister operation. Nor do we need to protect the queue
+ -- structure with a lock.
+
+ pragma Assert (Handler_Addr /= System.Null_Address);
+
Registered_Handlers :=
new Registered_Handler'(H => Handler_Addr, Next => Registered_Handlers);
end Register_Interrupt_Handler;
pragma Volatile_Components (User_Entry);
-- Holds the task and entry index (if any) for each interrupt / signal
- -- Type and Head, Tail of the list containing Registered Interrupt
- -- Handlers. These definitions are used to register the handlers
- -- specified by the pragma Interrupt_Handler.
+ -- Type and the list containing Registered Interrupt Handlers. These
+ -- definitions are used to register the handlers specified by the pragma
+ -- Interrupt_Handler.
+
+ --------------------------
+ -- Handler Registration --
+ --------------------------
type Registered_Handler;
type R_Link is access all Registered_Handler;
type Registered_Handler is record
- H : System.Address := System.Null_Address;
- Next : R_Link := null;
+ H : System.Address;
+ Next : R_Link;
end record;
- Registered_Handler_Head : R_Link := null;
- Registered_Handler_Tail : R_Link := null;
+ Registered_Handlers : R_Link := null;
Server_ID : array (Interrupt_ID) of System.Tasking.Task_Id :=
(others => System.Tasking.Null_Task);
-------------------
function Is_Registered (Handler : Parameterless_Handler) return Boolean is
+ Ptr : R_Link := Registered_Handlers;
type Acc_Proc is access procedure;
function To_Fat_Ptr is new Ada.Unchecked_Conversion
(Parameterless_Handler, Fat_Ptr);
- Ptr : R_Link;
Fat : Fat_Ptr;
begin
Fat := To_Fat_Ptr (Handler);
- Ptr := Registered_Handler_Head;
while Ptr /= null loop
if Ptr.H = Fat.Handler_Addr.all'Address then
return True;
--------------------------------
procedure Register_Interrupt_Handler (Handler_Addr : System.Address) is
- New_Node_Ptr : R_Link;
-
begin
-- This routine registers a handler as usable for dynamic interrupt
-- handler association. Routines attaching and detaching handlers
pragma Assert (Handler_Addr /= System.Null_Address);
- New_Node_Ptr := new Registered_Handler;
- New_Node_Ptr.H := Handler_Addr;
-
- if Registered_Handler_Head = null then
- Registered_Handler_Head := New_Node_Ptr;
- Registered_Handler_Tail := New_Node_Ptr;
- else
- Registered_Handler_Tail.Next := New_Node_Ptr;
- Registered_Handler_Tail := New_Node_Ptr;
- end if;
+ Registered_Handlers :=
+ new Registered_Handler'(H => Handler_Addr, Next => Registered_Handlers);
end Register_Interrupt_Handler;
-----------------------