------------------------------------------- ------------------------------------- ------------------------------------------------------------------------------ -- 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: 431 $ -- $Date: 2011-04-24 13:35:23 +0200 (dim., 24 avr. 2011) $ -- $Author: singhoff $ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ with Ada.Text_IO; use Ada.Text_IO; with Sax.Readers; use Sax.Readers; with Sax.Exceptions; use Sax.Exceptions; with Sax.Locators; use Sax.Locators; with Sax.Attributes; use Sax.Attributes; with Unicode.CES; use Unicode.CES; with Unicode; use Unicode; with Offsets; use Offsets; use Offsets.Offsets_Table_Package; with Parameters; use Parameters; use Parameters.User_Defined_Parameters_Table_Package; with Ada.Strings.Unbounded; use Ada.Strings.Unbounded; with strings; use strings; with unbounded_strings; use unbounded_strings; with Dependencies; use Dependencies; with Resources; use Resources; use Resources.resource_accesses; with Resource_Set; use Resource_Set; use Resource_Set.Generic_Resource_Set; with Messages; use Messages; with Message_Set; use Message_Set; use Message_Set.Generic_Message_Set; with Event_Analyzer_Set; use Event_Analyzer_Set; use Event_Analyzer_Set.Generic_Event_Analyzer_Set; with Ada.Numerics.Aux; use Ada.Numerics.Aux; with Tasks; use Tasks; with Task_Set; use Task_Set; use Task_Set.Generic_Task_Set; with Address_Space_Set; use Address_Space_Set; use Address_Space_Set.Generic_Address_Space_Set; with Buffers; use Buffers; use Buffers.Buffer_Roles_package; with Buffer_Set; use Buffer_Set; use Buffer_Set.Generic_Buffer_Set; with Processors; use Processors; with Queueing_Systems; use Queueing_Systems; with Time_Unit_Events; use Time_Unit_Events; use Time_Unit_Events.Time_Unit_Package; with Scheduling_Analysis; use Scheduling_Analysis; with Scheduler_Interface; use Scheduler_Interface; with Task_Dependencies; use Task_Dependencies; with Network_Set; use Network_Set; with Ada.Strings.Maps; use Ada.Strings.Maps; with Networks; use Networks; package body Xml_generic_Parsers.event_table is Processor_Name : Unbounded_String; Task_Name : Unbounded_String; Resource_Name : Unbounded_String; Message_Name : Unbounded_String; Buffer_Name : Unbounded_String; Number : Natural; Time_Value : Natural; New_Processor_Events : Scheduling_Result_Ptr; New_Event : Time_Unit_Event_Ptr; ok : Boolean; function Get_Parsed_Event_Table (Handler : in Xml_Event_Table_Parser) return Scheduling_Table_Ptr is begin return Handler.Parsed_Event_Table; end Get_Parsed_Event_Table; procedure Set_Scheduled_System (Handler : in out Xml_Event_Table_Parser; Scheduled_System : in System) is begin Handler.Scheduled_System := Scheduled_System; end Set_Scheduled_System; procedure Initialize_Event_Table_Parser (Handler : in out Xml_Event_Table_Parser) is begin Handler.Current_Parameter := 1; end Initialize_Event_Table_Parser; procedure Start_Document (Handler : in out Xml_Event_Table_Parser) is begin Initialize_Event_Table_Parser (Handler); Handler.Parsed_Event_Table := new Scheduling_Table; end Start_Document; procedure Start_Element (Handler : in out Xml_Event_Table_Parser; Namespace_Uri : Unicode.CES.Byte_Sequence := ""; Local_Name : Unicode.CES.Byte_Sequence := ""; Qname : Unicode.CES.Byte_Sequence := ""; Atts : Sax.Attributes.Attributes'Class) is begin Handler.Current_Parameter := 1; end Start_Element; procedure Read_Time_Value (Handler : in out Xml_Event_Table_Parser) is begin to_natural (Handler.Parameter_List (1), Number, ok); if not ok then Put_Line ("Warning : Error on data type. From " & To_String (Handler.Locator.all)); end if; Time_Value := Number; end Read_Time_Value; procedure End_Element (Handler : in out Xml_Event_Table_Parser; Namespace_Uri : Unicode.CES.Byte_Sequence := ""; Local_Name : Unicode.CES.Byte_Sequence := ""; Qname : Unicode.CES.Byte_Sequence := "") is A_Buffer : Buffer_Ptr; A_Message : Generic_Message_Ptr; A_Task : Generic_Task_Ptr; A_Resource : Generic_Resource_Ptr; A_Processor : Generic_Processor_Ptr; begin if Qname = "name" then Processor_Name := Handler.Parameter_List (1); A_Processor := Search_Processor (Handler.Scheduled_System.Processors, Processor_Name); New_Processor_Events := new Scheduling_Result; New_Processor_Events.has_error := False; New_Processor_Events.scheduling_msg := empty_string; New_Processor_Events.error_msg := empty_string; New_Processor_Events.result := new Scheduling_Sequence; add (Handler.Parsed_Event_Table.all, A_Processor, New_Processor_Events.all); Initialize_Event_Table_Parser (Handler); end if; if Qname = "write_to_buffer" then Buffer_Name := Handler.Parameter_List (2); Task_Name := Handler.Parameter_List (3); A_Task := Search_Task (Handler.Scheduled_System.Tasks, Task_Name); A_Buffer := Search_Buffer (Handler.Scheduled_System.Buffers, Buffer_Name); to_natural (Handler.Parameter_List (4), Number, ok); if not ok then Put_Line ("Warning : Error on data type. From " & To_String (Handler.Locator.all)); end if; Read_Time_Value (Handler); New_Event := new Time_Unit_Event (Write_To_Buffer); New_Event.write_buffer := A_Buffer; New_Event.write_task := A_Task; New_Event.write_size := Number; add (New_Processor_Events.result.all, Time_Value, new_event); Initialize_Event_Table_Parser (Handler); end if; if Qname = "read_from_buffer" then Buffer_Name := Handler.Parameter_List (2); Task_Name := Handler.Parameter_List (3); A_Task := Search_Task (Handler.Scheduled_System.Tasks, Task_Name); A_Buffer := Search_Buffer (Handler.Scheduled_System.Buffers, Buffer_Name); to_natural (Handler.Parameter_List (4), Number, ok); if not ok then Put_Line ("Warning : Error on data type. From " & To_String (Handler.Locator.all)); end if; Read_Time_Value (Handler); New_Event := new Time_Unit_Event (Read_From_Buffer); New_Event.read_buffer := A_Buffer; New_Event.read_task := A_Task; New_Event.read_size := Number; add (New_Processor_Events.result.all, Time_Value, new_event); Initialize_Event_Table_Parser (Handler); end if; if Qname = "send_message" then Message_Name := Handler.Parameter_List (2); Task_Name := Handler.Parameter_List (3); A_Message := Search_Message (Handler.Scheduled_System.Messages, Message_Name); A_Task := Search_Task (Handler.Scheduled_System.Tasks, Task_Name); Read_Time_Value (Handler); New_Event := new Time_Unit_Event (Send_Message); New_Event.send_task := A_Task; New_Event.send_message := A_Message; add (New_Processor_Events.result.all, Time_Value, new_event); Initialize_Event_Table_Parser (Handler); end if; if Qname = "receive_message" then Message_Name := Handler.Parameter_List (2); Task_Name := Handler.Parameter_List (3); A_Message := Search_Message (Handler.Scheduled_System.Messages, Message_Name); A_Task := Search_Task (Handler.Scheduled_System.Tasks, Task_Name); Read_Time_Value (Handler); New_Event := new Time_Unit_Event (Receive_Message); New_Event.receive_task := A_Task; New_Event.receive_message := A_Message; add (New_Processor_Events.result.all, Time_Value, new_event); Initialize_Event_Table_Parser (Handler); end if; if Qname = "allocate_resource" then Resource_Name := Handler.Parameter_List (2); Task_Name := Handler.Parameter_List (3); A_Resource := Search_Resource (Handler.Scheduled_System.Resources, Resource_Name); A_Task := Search_Task (Handler.Scheduled_System.Tasks, Task_Name); Read_Time_Value (Handler); New_Event := new Time_Unit_Event (Allocate_Resource); New_Event.allocate_task := A_Task; New_Event.allocate_resource := A_Resource; add (New_Processor_Events.result.all, Time_Value, new_event); Initialize_Event_Table_Parser (Handler); end if; if Qname = "release_resource" then Resource_Name := Handler.Parameter_List (2); Task_Name := Handler.Parameter_List (3); A_Resource := Search_Resource (Handler.Scheduled_System.Resources, Resource_Name); A_Task := Search_Task (Handler.Scheduled_System.Tasks, Task_Name); Read_Time_Value (Handler); New_Event := new Time_Unit_Event (Release_Resource); New_Event.release_task := A_Task; New_Event.release_resource := A_Resource; add (New_Processor_Events.result.all, Time_Value, new_event); Initialize_Event_Table_Parser (Handler); end if; if Qname = "wait_for_resource" then Resource_Name := Handler.Parameter_List (2); Task_Name := Handler.Parameter_List (3); A_Resource := Search_Resource (Handler.Scheduled_System.Resources, Resource_Name); A_Task := Search_Task (Handler.Scheduled_System.Tasks, Task_Name); Read_Time_Value (Handler); New_Event := new Time_Unit_Event (Wait_For_Resource); New_Event.wait_for_resource_task := A_Task; New_Event.wait_for_resource := A_Resource; add (New_Processor_Events.result.all, Time_Value, new_event); Initialize_Event_Table_Parser (Handler); end if; if Qname = "task_activation" then Task_Name := Handler.Parameter_List (2); A_Task := Search_Task (Handler.Scheduled_System.Tasks, Task_Name); Read_Time_Value (Handler); New_Event := new Time_Unit_Event (Task_activation); New_Event.activation_task := A_Task; add (New_Processor_Events.result.all, Time_Value, new_event); Initialize_Event_Table_Parser (Handler); end if; if Qname = "running_task" then Task_Name := Handler.Parameter_List (2); A_Task := Search_Task (Handler.Scheduled_System.Tasks, Task_Name); Read_Time_Value (Handler); New_Event := new Time_Unit_Event (Running_Task); New_Event.running_task := A_Task; add (New_Processor_Events.result.all, Time_Value, new_event); Initialize_Event_Table_Parser (Handler); end if; if Qname = "start_of_task_capacity" then Task_Name := Handler.Parameter_List (2); A_Task := Search_Task (Handler.Scheduled_System.Tasks, Task_Name); Read_Time_Value (Handler); New_Event := new Time_Unit_Event (Start_Of_Task_Capacity); New_Event.start_task := A_Task; add (New_Processor_Events.result.all, Time_Value, new_event); Initialize_Event_Table_Parser (Handler); end if; if Qname = "end_of_task_capacity" then Task_Name := Handler.Parameter_List (2); A_Task := Search_Task (Handler.Scheduled_System.Tasks, Task_Name); Read_Time_Value (Handler); New_Event := new Time_Unit_Event (End_Of_Task_Capacity); New_Event.end_task := A_Task; add (New_Processor_Events.result.all, Time_Value, new_event); Initialize_Event_Table_Parser (Handler); end if; end End_Element; end Xml_generic_Parsers.event_table;