Filter¶
Code sample for an Ada filter
with Types_Definitions_Tp; with Buffers; with Interfaces; package body Narval.Actors.Actives.Filters_Tp is procedure Buffer_Handling (Object : access Tp_Filter_Type) is Full_Buffer_Handle : Buffers.Buffer_Handle_Type; Free_Buffer_Handle : Buffers.Buffer_Handle_Type; Output_Address : System.Address; Output_Size : Buffers.Buffer_Size_Type; Input_Address : System.Address; Input_Size : Buffers.Buffer_Size_Type; Used_Size_Of_Output_Buffer : Interfaces.Unsigned_32 := 0; Input_Buffer : Buffers.Local.Local_Buffer_Type renames Object.Inputs (Object.Inputs'First).Buffer; Output_Buffer : Buffers.Local.Duplicate.Duplicate_Buffer_Type renames Object.Outputs (Object.Outputs'First).Buffer; use Buffers; use type Interfaces.Unsigned_32; begin select Input_Buffer.Get_Full_Buffer (Full_Buffer_Handle); loop select Output_Buffer.Get_Free_Buffer (Free_Buffer_Handle); exit; or delay 1.0; Log4ada.Loggers.Info_Out (Object.Logger'Access, " filter => waiting for free memory"); end select; end loop; Input_Size := Full_Buffer_Handle.Get_Used_Bytes; Input_Address := Full_Buffer_Handle.Get_Address; Output_Size := Free_Buffer_Handle.Get_Available_Bytes; Output_Address := Free_Buffer_Handle.Get_Address; declare Output_Data : Types_Definitions_Tp.Event_Type; for Output_Data'Address use Output_Address; use type Interfaces.Unsigned_64; Input_Data : Types_Definitions_Tp.Event_Type; for Input_Data'Address use Input_Address; begin for I in Output_Data.Words'Range loop Output_Data.Words (I) := Input_Data.Words (I) * 2; end loop; Object.Number_Of_Event_Produced := Object.Number_Of_Event_Produced + 1; Free_Buffer_Handle.Set_Used_Bytes (Output_Data'Size / 8); end; Input_Buffer.Release_Full_Buffer (Full_Buffer_Handle); Used_Size_Of_Output_Buffer := Types_Definitions_Tp.Event_Type'Size / 8; Free_Buffer_Handle.Set_Used_Bytes (Buffers.Buffer_Size_Type (Used_Size_Of_Output_Buffer)); Output_Buffer.Release_Free_Buffer (Free_Buffer_Handle); or delay 1.0; end select; exception when E : others => Log4ada.Loggers.Error_Out (Object.Logger'Access, "exception in buffer handler", E); end Buffer_Handling; end Narval.Actors.Actives.Filters_Tp;