Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
ProjetSyntheseL2
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
GOLINELLI Mathias
ProjetSyntheseL2
Commits
270e9959
Commit
270e9959
authored
2 years ago
by
KOEHLE Nicolas
Browse files
Options
Downloads
Patches
Plain Diff
Update src/algo.c
parent
2be39c38
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/algo.c
+56
-5
56 additions, 5 deletions
src/algo.c
with
56 additions
and
5 deletions
src/algo.c
+
56
−
5
View file @
270e9959
...
...
@@ -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 F
AIRE
// A F
INIR !
//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
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment