------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- Cheddar is a GNU GPL real time scheduling analysis tool. -- This program provides services to automatically check performances -- of real time architectures. -- -- Copyright (C) 2002-2010, by Frank Singhoff, Alain Plantec, Jerome Legrand -- -- The Cheddar project was started in 2002 by -- the LISyC Team, University of Western Britanny. -- -- Since 2008, Ellidiss technologies also contributes to the development of -- Cheddar and provides industrial support. -- -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -- -- -- Contact : cheddar@listes.univ-brest.fr -- ----------------------------------------------------------------------------- -- Last update : -- $Rev: 561 $ -- $Date: 2012-10-15 09:17:19 +0200 (Mon, 15 Oct 2012) $ -- $Author: gaudel $ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ with Time_Unit_Events; use Time_Unit_Events; with Time_Unit_Events.extended; use Time_Unit_Events.extended; with Call_Framework_Interface; use Call_Framework_Interface; use Call_Framework_Interface.Framework_Request_Package; use Call_Framework_Interface.Framework_Response_Package; with Text_IO; use Text_IO; with Xml_Tag; use Xml_Tag; with unbounded_strings; use unbounded_strings; with Task_Set; use Task_Set; use Task_Set.Generic_Task_Set; with Buffer_Set; use Buffer_Set; use Buffer_Set.Generic_Buffer_Set; with Ada.Exceptions; use Ada.Exceptions; with Processors; use Processors; with Processor_Set; use Processor_Set; use Processor_Set.Generic_Processor_Set; with framework; use framework; with Call_Scheduling_Framework; use Call_Scheduling_Framework; with Call_Memory_Framework; use Call_Memory_Framework; use Call_Memory_Framework.Buffer_Result_Package; with Call_Resource_Framework; use Call_Resource_Framework; with Call_Dependency_Framework; use Call_Dependency_Framework; with Call_Random_Framework; use Call_Random_Framework; with Call_Design_Pattern_Framework; use Call_Design_Pattern_Framework; with Scheduler_Interface; use Scheduler_Interface; with Multiprocessor_Services_Interface; use Multiprocessor_Services_Interface; use Multiprocessor_Services_Interface.Scheduling_Result_Per_Processor_Package; with Translate; use Translate; with Translate.English_Labels; with Translate.Francais_Labels; with Translate.AADL_Labels; with Text_IO; use Text_IO; with Debug; use Debug; with initialize_framework; use initialize_framework; with gnat.os_lib; use gnat.os_lib; with Ada.IO_Exceptions; use Ada.IO_Exceptions; with GNAT.Current_Exception; use GNAT.Current_Exception; package body Call_Framework is type Sub_Framework_Request is record Statement : Framework_Statement_Type; Param : Framework_Parameters_Table; Target : Generic_Processor_Ptr; end record; procedure initialize (Aadl_Labels : in Boolean) is s : gnat.os_lib.string_access; begin -- Initialize an object id generator -- initialize(framework_id); -- Initialize all labels of the framework -- Translate.Initialize; if Current_Language = English then Translate.English_Labels.Initialize; else Translate.Francais_Labels.Initialize; end if; if (Aadl_Labels = True) then Translate.AADL_Labels.Initialize; end if; -- Read install path -- s:=getenv("CHEDDAR_INSTALL_PATH"); install_path:=to_unbounded_string(s.all); if install_path = empty_string then Put_Line("Warning : CHEDDAR_INSTALL_PATH is not defined : CHEDDAR_INSTALL_PATH is set with default value '.' "); install_path:=to_unbounded_string("./"); end if; -- Save that we have initialized the framework -- Now we can check that the framework is readu to use -- set_initialize; end initialize; procedure Sequential_Framework_Request (Sys : in out System; Request : in Framework_Request_Table; Response : in out Framework_Response_Table) is begin check_initialize; Sequential_Framework_Request (Sys, Request, Response, Total_Order, String_Output); end Sequential_Framework_Request; procedure Initialize (F : in out Framework_Request) is begin F.target := empty_string; initialize (F.param); end Initialize; procedure Call_A_Request (Sys : in out System; Request : in Sub_Framework_Request; A_Response : in out Unbounded_String; Output : in Output_Format := String_Output) is -- Parameters to be used for calling the "computing time line" service -- Event_To_Generate : Time_Unit_Event_Type_Boolean_Table; Period : Natural := 0; Schedule_With_Offsets : Boolean := True; Schedule_With_Precedencies : Boolean := True; Schedule_With_Resources : Boolean := True; With_Task_Specific_Seed : Boolean := True; Global_Seed_Value : Integer := 0; Predictable_Global_Seed : Boolean := True; Schedule_With_Task_Groups : Boolean := False; ok : boolean:=false; begin case Request.Statement is ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Time_Line => Initialize (Event_To_Generate, True); -- Check parameters -- for I in 0 .. Request.Param.nb_entries - 1 loop Ok:=false; for k in Integer_framework_parameter_name'range loop if (Request.Param.entries (I).parameter_name = integer_framework_parameter_name (k)) then ok:=true; end if; end loop; for k in boolean_framework_parameter_name'range loop if (Request.Param.entries (I).parameter_name = Boolean_framework_parameter_name (k)) then ok:=true; end if; end loop; for k in string_framework_parameter_name'range loop if (Request.Param.entries (I).parameter_name = string_framework_parameter_name (k)) then ok:=true; end if; end loop; if not ok then Raise_Exception (Unexpected_Parameter'Identity, To_String (Request.Param.entries (I).parameter_name)); end if; for k in integer_framework_parameter_name'range loop if (Request.Param.entries (I).type_of_parameter/=integer_parameter) and (Request.Param.entries (I).parameter_name = integer_framework_parameter_name (k) ) then Raise_Exception (Parameter_Type_Error'Identity, To_String (Request.Param.entries (I).parameter_name)); end if; end loop; for k in boolean_framework_parameter_name'range loop if (Request.Param.entries (I).type_of_parameter/=boolean_parameter) and (Request.Param.entries (I).parameter_name = Boolean_framework_parameter_name (k) ) then Raise_Exception (Parameter_Type_Error'Identity, To_String (Request.Param.entries (I).parameter_name)); end if; end loop; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("period")) then Period := Request.Param.Entries (I).integer_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("seed_value")) then Global_Seed_Value := Request.Param.Entries (I).integer_value; With_Task_Specific_Seed := False; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("schedule_with_offsets")) then Schedule_With_Offsets := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("schedule_with_precedencies")) then Schedule_With_Precedencies := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("schedule_with_resources")) then Schedule_With_Resources := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("predictable")) then Predictable_Global_Seed := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("start_of_task_capacity")) then Event_To_Generate (Start_Of_Task_Capacity) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("end_of_task_capacity")) then Event_To_Generate (End_Of_Task_Capacity) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("write_to_buffer")) then Event_To_Generate (Write_To_Buffer) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("read_from_buffer")) then Event_To_Generate (Read_From_Buffer) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("running_task")) then Event_To_Generate (Running_Task) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("task_activation")) then Event_To_Generate (Task_activation) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("send_message")) then Event_To_Generate (Send_Message) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("receive_message")) then Event_To_Generate (Receive_Message) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("allocate_resource")) then Event_To_Generate (Receive_Message) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("release_resource")) then Event_To_Generate (Release_Resource) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("wait_for_resource")) then Event_To_Generate (Wait_For_Resource) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("address_space_activation")) then Event_To_Generate (address_space_activation) := Request.Param.entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("context_switch_overhead")) then Event_To_Generate (Context_Switch_Overhead) := Request.Param.Entries (I).boolean_value; end if; if (Request.Param.entries (I).parameter_name = To_Unbounded_String ("schedule_with_task_groups")) then Schedule_With_Task_Groups := Request.Param.entries (I).boolean_value; end if; end loop; -- Call framework -- Compute_Simulation_Time_Line (Sys, A_Response, -- With period -- Period, -- With offsets -- Schedule_With_Offsets, -- With Task precedencies -- Schedule_With_Precedencies, -- With Shared resources -- Schedule_With_Resources, -- With task specific seed -- With_Task_Specific_Seed, -- With a global seed value -- Global_Seed_Value, -- Predictable seed of not ? -- Predictable_Global_Seed, -- Which event we should generate -- Event_To_Generate, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Basics => Compute_Simulation_Basics (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Run_Event_Handler => Run_User_Defined_Event_Handlers (Sys, A_Response, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Priority_Inversion => Priority_Inversion_Detection (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_General_Task => Partionning_Tasks (Sys, A_Response, General_Task, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_First_Fit => Partionning_Tasks (Sys, A_Response, First_Fit, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Next_Fit => Partionning_Tasks (Sys, A_Response, Next_Fit, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Best_Fit => Partionning_Tasks (Sys, A_Response, Best_Fit, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Small_Task => Partionning_Tasks (Sys, A_Response, Small_Task, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Deadlock => Deadlock_Detection (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Context_Switch_Number => Compute_Simulation_Number_Of_Context_Switch (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Preemption_Number => Compute_Simulation_Number_Of_Preemption (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Response_Time => if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_Response_Time (Sys, A_Response, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Cpu_Utilization => if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_Processor_Utilization_Factor (Sys, A_Response, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Test_By_Name => -- Check parameters -- if (Request.Param.Nb_Entries /= 1) then Raise_Exception (Invalid_Number_Of_Parameter'Identity, "1 expected parameter"); end if; if (Request.Param.entries (0).parameter_name /= To_Unbounded_String ("feasibility_test_name")) then Raise_Exception (Unexpected_Parameter'Identity, "feasibility_test_name"); end if; Compute_feasibility_test_by_name (Sys, A_Response, Request.Target, Request.Param.Entries (0).string_value, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Response_Time => -- Check parameters -- if (Request.Param.Nb_Entries /= 3) then Raise_Exception (Invalid_Number_Of_Parameter'Identity, "3 expected parameters"); end if; if (Request.Param.entries (0).parameter_name /= To_Unbounded_String ("worst_case")) then Raise_Exception (Unexpected_Parameter'Identity, "worst_case"); end if; if (Request.Param.entries (1).parameter_name /= To_Unbounded_String ("best_case")) then Raise_Exception (Unexpected_Parameter'Identity, "best_case"); end if; if (Request.Param.entries (2).parameter_name /= To_Unbounded_String ("average_case")) then Raise_Exception (Unexpected_Parameter'Identity, "average_case"); end if; Compute_Simulation_Response_Time (Sys, A_Response, Request.Target, Request.Param.Entries (0).boolean_value, Request.Param.Entries (1).boolean_value, Request.Param.Entries (2).boolean_value, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_Blocking_Time => -- Check parameters -- if (Request.Param.Nb_Entries /= 3) then Raise_Exception (Invalid_Number_Of_Parameter'Identity, "3 expected parameters"); end if; if (Request.Param.entries (0).parameter_name /= To_Unbounded_String ("worst_case")) then Raise_Exception (Unexpected_Parameter'Identity, "worst_case"); end if; if (Request.Param.entries (1).parameter_name /= To_Unbounded_String ("best_case")) then Raise_Exception (Unexpected_Parameter'Identity, "best_case"); end if; if (Request.Param.entries (2).parameter_name /= To_Unbounded_String ("average_case")) then Raise_Exception (Unexpected_Parameter'Identity, "average_case"); end if; Compute_Simulation_Blocking_Time (Sys, A_Response, Request.Target, Request.Param.Entries (0).boolean_value, Request.Param.Entries (1).boolean_value, Request.Param.Entries (2).boolean_value, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Simulation_All_Response_Time => null; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Compute_And_Set_Blocking_Time => Compute_Bound_On_Blocking_Time (Sys, A_Response, Request.Target, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Compute_Blocking_Time => Compute_Bound_On_Blocking_Time (Sys, A_Response, Request.Target, False, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Feasibility_Basics => if (Get_Number_Of_Task_From_Processor (Sys.Tasks, Request.Target.name) /= 0) then Compute_Feasibility_Basics (Sys, A_Response, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Set_Priorities_According_To_Deadline_Monotonic => Set_Priorities (Sys, A_Response, Request.Target, Deadline_Monotonic_Protocol, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Scheduling_Set_Priorities_According_To_Rate_Monotonic => Set_Priorities (Sys, A_Response, Request.Target, Rate_Monotonic_Protocol, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Buffer_Feasibility_Tests => if (Get_Number_Of_Buffer_From_Processor (Sys.Buffers, Request.Target.name) /= 0) then Compute_Buffer_Feasibility_Tests (Sys, A_Response, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Global_Memory_Compute_Requirement_Analysis => Compute_Memory_Requirement_Analysis (Sys, A_Response, False, Output); when Global_Memory_Set_Requirement_Analysis => Compute_Memory_Requirement_Analysis (Sys, A_Response, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Buffer_Scheduling_Simulation => if (Get_Number_Of_Buffer_From_Processor (Sys.Buffers, Request.Target.name) /= 0) then Compute_Buffer_Scheduling_Simulation (Sys, A_Response, Request.Target, Output); end if; ----------------------------------------------------------- ----------------------------------------------------------- when Random_Response_Time_Density => Compute_Response_Time_Density (Sys, A_Response, Request.Target, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Compute_Chetto_Blazewicz_Priority => Chetto_Parameter_Modifications (Sys, A_Response, Request.Target, False, True, False, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Compute_Chetto_Blazewicz_Deadline => Chetto_Parameter_Modifications (Sys, A_Response, Request.Target, True, False, False, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Set_Chetto_Blazewicz_Deadline => Chetto_Parameter_Modifications (Sys, A_Response, Request.Target, True, False, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Set_Chetto_Blazewicz_Priority => Chetto_Parameter_Modifications (Sys, A_Response, Request.Target, False, True, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Compute_End_To_End_Response_Time_One_Step => Compute_End_To_End_Response_Time (Sys, A_Response, False, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Set_End_To_End_Response_Time_One_Step => Compute_End_To_End_Response_Time (Sys, A_Response, True, True, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Compute_End_To_End_Response_Time_All_Steps => Compute_End_To_End_Response_Time (Sys, A_Response, False, False, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Dependency_Set_End_To_End_Response_Time_All_Steps => Compute_End_To_End_Response_Time (Sys, A_Response, True, False, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Select_Feasibility_Tests_Simple => Select_Feasibility_Tests_Simple_System (Sys, A_Response, Output); ----------------------------------------------------------- ----------------------------------------------------------- when Select_Feasibility_Tests_Compositional => Select_Feasibility_Tests_Compositional_System (Sys, A_Response, Output); end case; exception when others=> a_response:=to_unbounded_string(Exception_Name) & to_unbounded_string(Exception_Message); end Call_A_Request; procedure Initialize_Before_Request (Request : in Framework_Request) is begin case Request.statement is when Scheduling_Simulation_Time_Line => initialize (Sched.all); when Buffer_Scheduling_Simulation => initialize (Buff); when others => null; end case; end Initialize_Before_Request; function Build_A_Title (Request : in Framework_Request) return Unbounded_String is begin case Request.statement is when Scheduling_Simulation_Basics => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language); when Scheduling_Simulation_Preemption_Number => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language); when Scheduling_Simulation_Context_Switch_Number => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language); when Scheduling_Simulation_All_Response_Time => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language); when Scheduling_Simulation_Priority_Inversion => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language); when Scheduling_Simulation_Deadlock => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language); when Scheduling_Simulation_Response_Time => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language); when Scheduling_Simulation_Blocking_Time => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language); when Scheduling_Simulation_Run_Event_Handler => return Start_Sched_Sim & unbounded_lf & Start_Title & Lb_Scheduling_Simulation (Current_Language) & Lb_Comma & Lb_Event_Analyzer (Current_Language); when Scheduling_Feasibility_First_Fit => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language) & Lb_Comma & Lb_Partition (Current_Language) & Lb_Partition_First_Fit (Current_Language); when Scheduling_Feasibility_General_Task => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language) & Lb_Comma & Lb_Partition (Current_Language) & Lb_Partition_General_Task (Current_Language); when Scheduling_Feasibility_Best_Fit => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language) & Lb_Comma & Lb_Partition (Current_Language) & Lb_Partition_Best_Fit (Current_Language); when Scheduling_Feasibility_Next_Fit => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language) & Lb_Comma & Lb_Partition (Current_Language) & Lb_Partition_Next_Fit (Current_Language); when Scheduling_Feasibility_Small_Task => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language) & Lb_Comma & Lb_Partition (Current_Language) & Lb_Partition_Small_Task (Current_Language); when Scheduling_Feasibility_Compute_And_Set_Blocking_Time => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language); when Scheduling_Feasibility_Compute_Blocking_Time => return Start_Block & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language); when Scheduling_Feasibility_Response_Time => return Start_Sched_Feas & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language); when Scheduling_Feasibility_Basics => return Start_Sched_Feas & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language); when Scheduling_Feasibility_Cpu_Utilization => return Start_Sched_Feas & unbounded_lf & Start_Title & Lb_Scheduling_Feasibility (Current_Language); when Scheduling_Set_Priorities_According_To_Deadline_Monotonic => return Start_Set_Prio & unbounded_lf & Start_Title & unbounded_lf & Lb_Set_Priorities (Current_Language); when Scheduling_Set_Priorities_According_To_Rate_Monotonic => return Start_Set_Prio & unbounded_lf & Start_Title & unbounded_lf & Lb_Set_Priorities (Current_Language); when Global_Memory_Set_Requirement_Analysis => return Start_Buf_Bound & unbounded_lf & Start_Title & Lb_Memory_Requirement_Analysis (Current_Language); when Global_Memory_Compute_Requirement_Analysis => return Start_Buf_Bound & unbounded_lf & Start_Title & Lb_Memory_Requirement_Analysis (Current_Language); when Buffer_Feasibility_Tests => return Start_Buf_Bound & unbounded_lf & Start_Title & Lb_Compute_Buffer (Current_Language); when Buffer_Scheduling_Simulation => return unbounded_lf & Lb_Draw_Buffer (Current_Language); when Random_Response_Time_Density => return Start_Response_Time_Density & Start_Title & unbounded_lf & Lb_Response_Time_Density (Current_Language); when Dependency_Compute_End_To_End_Response_Time_One_Step => return unbounded_lf & Lb_Jitter_From_Response_Time (Current_Language); when Dependency_Set_End_To_End_Response_Time_One_Step => return unbounded_lf & Lb_Jitter_From_Response_Time (Current_Language); when Dependency_Compute_End_To_End_Response_Time_All_Steps => return Start_End_To_End & unbounded_lf & Start_Title & Lb_Jitter_From_Response_Time (Current_Language); when Dependency_Set_End_To_End_Response_Time_All_Steps => return Start_End_To_End & unbounded_lf & Start_Title & Lb_Jitter_From_Response_Time (Current_Language); when Dependency_Compute_Chetto_Blazewicz_Priority => return Lb_Chetto (Current_Language); when Dependency_Compute_Chetto_Blazewicz_Deadline => return Lb_Chetto (Current_Language); when Dependency_Set_Chetto_Blazewicz_Priority => return Lb_Chetto (Current_Language); when Dependency_Set_Chetto_Blazewicz_Deadline => return Lb_Chetto (Current_Language); when Select_Feasibility_Tests_Simple => return Lb_Select_Simple (Current_Language); when Select_Feasibility_Tests_Compositional => return Lb_Select_Compositional (Current_Language); when Scheduling_Feasibility_Test_By_Name => return Lb_feasibility_test_by_name (Current_Language); when others => return empty_string; end case; end Build_A_Title; procedure Sequential_Framework_Request (Sys : in out System_Ptr; Request : in Framework_Request_Table; Response : in out Framework_Response_Table; Order : in Perform_Order; Output : in Output_Format) is begin check_initialize; Sequential_Framework_Request (Sys.all, Request, Response, Order, Output); end Sequential_Framework_Request; procedure Sequential_Framework_Request (Sys : in out System; Request : in Framework_Request_Table; Response : in out Framework_Response_Table; Order : in Perform_Order; Output : in Output_Format) is A_Response : Framework_Response; A_Processor : Generic_Processor_Ptr; My_Iterator : Processors_Iterator; A_Request : Sub_Framework_Request; begin check_initialize; for I in 0 .. Request.Nb_Entries - 1 loop Initialize_Before_Request (Request.Entries (I)); -- Here, we should take care of two cases : -- case 1 : the called service should be run for -- each processor (that's the most of services) -- case 2 : the called service is global to all processor and -- should be called one time only -- -- if (Request.Entries (I).statement = Scheduling_Simulation_Run_Event_Handler) or (Request.Entries (I).statement = Global_Memory_Set_Requirement_Analysis) or (Request.Entries (I).statement = Global_Memory_Compute_Requirement_Analysis) or (Request.Entries (I).statement = Scheduling_Simulation_Time_Line) or (Request.Entries (I).statement = Scheduling_Feasibility_Small_Task) or (Request.Entries (I).statement = Scheduling_Feasibility_Best_Fit) or (Request.Entries (I).statement = Scheduling_Feasibility_Next_Fit) or (Request.Entries (I).statement = Scheduling_Feasibility_First_Fit) or (Request.Entries (I).statement = Scheduling_Feasibility_General_Task) or (Request.Entries (I).statement = Dependency_Compute_End_To_End_Response_Time_One_Step) or (Request.Entries (I).statement = Dependency_Set_End_To_End_Response_Time_One_Step) or (Request.Entries (I).statement = Dependency_Compute_End_To_End_Response_Time_All_Steps) or (Request.Entries (I).statement = Dependency_Set_End_To_End_Response_Time_All_Steps) or (Request.Entries (I).statement = Dependency_Set_Chetto_Blazewicz_Deadline) or (Request.Entries (I).statement = Dependency_Compute_Chetto_Blazewicz_Priority) or (Request.Entries (I).statement = Dependency_Compute_Chetto_Blazewicz_Deadline) or (Request.Entries (I).statement = Dependency_Set_Chetto_Blazewicz_Priority) then -- Only one call for all processors -- Initialize (A_Response); A_Request.Param := Request.Entries (I).param; A_Request.Statement := Request.Entries (I).statement; Call_A_Request (Sys, A_Request, A_Response.text, Output); if A_Response.text /= empty_string then if Output /= Xml2_Output then A_Response.title := Build_A_Title (Request.Entries (I)); if A_Response.title /= empty_string then A_Response.title := unbounded_lf & unbounded_lf & A_Response.title & Lb_Colon & unbounded_lf & End_Title; end if; end if; Add (Response, A_Response); end if; else -- A call for each processor -- reset_iterator (Sys.Processors, My_Iterator); loop current_element (Sys.Processors, A_Processor, My_Iterator); -- Do a request -- if (A_Processor.name = Request.Entries (I).target) or (Request.Entries (I).target = empty_string) then Initialize (A_Response); A_Request.Target := A_Processor; A_Request.Param := Request.Entries (I).param; A_Request.Statement := Request.Entries (I).statement; Call_A_Request (Sys, A_Request, A_Response.text, Output); if A_Response.text /= empty_string then if Output /= Xml2_Output then A_Response.title := Build_A_Title (Request.Entries (I)); if A_Response.title /= empty_string then A_Response.title := unbounded_lf & A_Response.title & Lb_Comma & Lb_Processor (Current_Language) & Start_Proc & A_Processor.name & End_Proc & Lb_Colon & unbounded_lf & End_Title; end if; end if; Add (Response, A_Response); end if; end if; exit when is_last_element (Sys.Processors, My_Iterator); next_element (Sys.Processors, My_Iterator); end loop; end if; end loop; end Sequential_Framework_Request; procedure Parallel_Framework_Request (Sys : in out System; Request : in Framework_Request_Table; Response : in out Framework_Response_Table; Order : in Perform_Order := Total_Order; Output : in Output_Format := String_Output) is begin check_initialize; end Parallel_Framework_Request; procedure Distributed_Framework_Request (Sys : in out System; Request : in Framework_Request_Table; Response : in out Framework_Response_Table; Order : in Perform_Order := Total_Order; Output : in Output_Format := String_Output) is begin check_initialize; end Distributed_Framework_Request; end Call_Framework;