with systems; use systems; with tasks; use tasks; with framework_config; use framework_config; package body priority_assignment.rm is procedure Set_Priority_According_To_Rm (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; Periodic_Control (Tmp, Processor_Name); sort (Tmp, Decreasing_Period'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_Rm; end priority_assignment.rm;