Skip to content
Snippets Groups Projects
Commit 270e9959 authored by KOEHLE Nicolas's avatar KOEHLE Nicolas
Browse files

Update src/algo.c

parent 2be39c38
Branches
Tags
No related merge requests found
......@@ -251,7 +251,6 @@ void delete_ready_task_key(void * key) {
free(ready_key->task_id);
free(ready_key);
}
/**
* @brief Comparer deux tâches \p a et \p b de la file d'attente afin de définir la tâche la plus prioritaire.
* Les deux paramètres d'entrée \p a et \p b sont de type struct ready_task_key_t *.
......@@ -263,21 +262,22 @@ void delete_ready_task_key(void * key) {
*/
int ready_task_preceed(const void * a, const void * b) {
// A FAIRE
struct ready_task_t* ta = a;
struct ready_task_t* tb = b;
struct ready_task_key_t* ta = a;
struct ready_task_key_t* tb = b;
int res = get_ready_task_remaining_processing_time(b) - get_ready_task_remaining_processing_time(a);
if (res == 0)
return get_ready_task_id(a) < get_ready_task_id(b);
else
return res > 0;
}
//note: peut etre utiliser strcmp pour comparer les chars ?
/********************************************************************
* The algorithm
********************************************************************/
struct schedule_t * create_schedule(Instance I, int num_m, int preemption, int balanced_tree) {
// A FAIRE
// A FINIR !
//initialisation
struct schedule_t* ordonnancement = new_schedule(num_m);
struct tree_t* ready_tasks = new_tree(balanced_tree, ready_task_preceed, view_ready_task_key, view_task, delete_ready_task_key, delete_task);
......@@ -294,7 +294,58 @@ struct schedule_t * create_schedule(Instance I, int num_m, int preemption, int b
node = get_successor(node);
}
while(get_tree_size(event_tree) != 0){
//struct tree_node_t* =
//Extraire de E l’ ́evenement e correspondant a l’instant t le plus petit
//Partie fausse, a faire
struct tree_node_t* event_node = get_node(event_tree); // ?
struct event_key_t* event_key = (struct event_key_t *) get_tree_node_key(event_node);
struct task_t* task = tree_remove(event_tree, event_key); //recuperer la data et la cast en tache
//fin partie fausse
// Si e concerne la libération d'une tache Tj
if (get_event_type(event_key) == EVT_LIBERATION) {
int machine = find_empty_machine(ordonnancement, get_event_time(event_key));
//si il existe une machine Mi libre en t alors
if (machine != -1) {
//Affecter Tj a Mi en t dans S
add_task_to_schedule(ordonnancement, task, machine, get_event_time(event_key), get_event_time(event_key) + get_event_processing_time(event_key));
//Ajouter dans E l’ evenement fin d’execution de la tache Tj
struct event_key_t* end_key = new_event_key(EVT_FIN_EXEC, get_event_time(event_key) + get_event_processing_time(event_key), get_event_processing_time(event_key), get_task_id(task), machine);
tree_insert(event_tree, end_key, task);
}
else {
//Ajouter Tj dans la file d’attente Q
tree_insert(ready_tasks, event_key, task);
}
}
else if(get_event_type(event_key) == EVT_FIN_EXEC) { //sinon si e concerne la fin d’execution d’une tache Tj sur Mi alors
if(get_tree_size(ready_tasks) != 0){ ////si la file d’attente Q n’est pas vide
//Extraire de Q la tache Tk avec la duree la plus courte (regle SPT)
struct event_key_t* shortest_task_key = NULL;
struct task_t* shortest_task = NULL;
//Affecter Tk a Mi en t dans S
int machine = find_empty_machine(ordonnancement, get_event_time(event_key));
add_task_to_schedule(ordonnancement, shortest_task, machine, get_event_time(event_key), get_event_time(event_key) + get_event_processing_time(event_key));
//Ajouter dans E l’ ́evenement fin d’execution de la tache
struct event_key_t* end_key = new_event_key(EVT_FIN_EXEC, get_event_time(event_key) + get_event_processing_time(event_key), get_event_processing_time(event_key), get_task_id(task), machine);
tree_insert(event_tree, end_key, shortest_task);
}
}
//delete_event_key(event_key); //pas sur de ça
}
//delete_tree(event_tree, );
//delete_tree(ready_tasks, );
return ordonnancement;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment