------------------------------------------------------------------------------ ------------------------------------------------------------------------------ -- Cheddar is a GNU GPL real-time scheduling analysis tool. -- This program provides services to automatically check schedulability and -- other performance criteria of real-time architecture models. -- -- Copyright (C) 2002-2016, Frank Singhoff, Alain Plantec, Jerome Legrand -- -- The Cheddar project was started in 2002 by -- Frank Singhoff, Lab-STICC UMR 6285 laboratory, Université de Bretagne Occidentale -- -- Cheddar has been published in the "Agence de Protection des Programmes/France" in 2008. -- Since 2008, Ellidiss technologies also contributes to the development of -- Cheddar and provides industrial support. -- -- The full list of contributors and sponsors can be found in AUTHORS.txt and SPONSORS.txt -- -- 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: 1249 $ -- $Date: 2014-08-28 07:02:15 +0200 (Fri, 28 Aug 2014) $ -- $Author: singhoff $ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ with tasks; use tasks; with framework_config; use framework_config; with systems; use systems; package body priority_assignment.dm is procedure Set_Priority_According_To_Dm (My_Tasks : in out Tasks_Set; Processor_Name : in Unbounded_String := empty_string) is Iterator1 : Tasks_Iterator; Task1 : Generic_Task_Ptr; Iterator2 : Tasks_Iterator; Task2 : Generic_Task_Ptr; Current_Prio : Priority_Range := 1; Tmp : Tasks_Set; begin if Processor_Name = empty_string then duplicate (My_Tasks, Tmp); else Current_Processor_Name := Processor_Name; select_and_copy (My_Tasks, Tmp, Select_Cpu'Access); end if; sort (Tmp, Decreasing_Deadline'Access); -- Assign priorities -- reset_iterator (Tmp, Iterator1); loop current_element (Tmp, Task1, Iterator1); if (Task1.cpu_name = Processor_Name) or (Processor_Name = empty_string) then Task1.priority := Current_Prio; Current_Prio := Current_Prio + 1; end if; exit when is_last_element (Tmp, Iterator1); next_element (Tmp, Iterator1); end loop; -- Copy resulting task objects in My_Tasks -- reset_iterator (Tmp, Iterator1); loop current_element (Tmp, Task1, Iterator1); reset_iterator (My_Tasks, Iterator2); loop current_element (My_Tasks, Task2, Iterator2); if (Task2.name = Task1.name) then Task2.priority := Task1.priority; end if; exit when Task2.name = Task1.name; exit when is_last_element (My_Tasks, Iterator2); next_element (My_Tasks, Iterator2); end loop; exit when is_last_element (Tmp, Iterator1); next_element (Tmp, Iterator1); end loop; free (Tmp); end Set_Priority_According_To_Dm; end priority_assignment.dm;