My Project
Chargement...
Recherche...
Aucune correspondance
condition.c
Aller à la documentation de ce fichier.
1
7#include <manux/condition.h>
8#include <manux/memoire.h> // NULL
9#include <manux/debug.h> // assert
10#if defined(MANUX_CONDITION_AUDIT) && defined(MANUX_KMALLOC)
11# include <manux/kmalloc.h>
12# include <manux/listetaches.h>
13#endif
14
15#if defined(MANUX_CONDITION_AUDIT) && defined(MANUX_KMALLOC)
16
20typedef struct _CelluleCondition {
21 Condition * condition;
22 struct _CelluleCondition * suivant;
23} CelluleCondition;
24
25typedef struct _ListeConditions {
26 CelluleCondition * tete;
27 CelluleCondition * queue;
28} ListeConditions;
29
33static
34ListeConditions * listeConditionsCreer(void)
35{
36 ListeConditions * result;
37
38 result = (ListeConditions *) kmalloc(sizeof(ListeConditions));
39
40 result->tete = NULL;
41 result->queue = NULL;
42
43 return result;
44}
45
50static
51void listeConditionsInserer(ListeConditions * l, Condition * c)
52{
53 CelluleCondition * cell = (CelluleCondition *) kmalloc(sizeof(CelluleCondition));
54
55 assert(l != NULL);
56 assert(c != NULL);
57
58 if (cell != NULL) {
59 cell->condition = c;
60 cell->suivant = NULL;
61 if (l->queue != NULL) {
62 l->queue->suivant = cell;
63 }
64 l->queue = cell;
65 if (l->tete == NULL) {
66 l->tete = cell;
67 }
68 }
69}
70
74static ListeConditions * listeConditions = NULL;
75
79void conditionsAfficherEtat(void)
80{
81 CelluleCondition * cell;
82 CelluleTache * cellT;
83
84 printk("\nEtat des variables de condition sur le systeme :\n\n");
85 printk("Cond | s | d | Attente\n");
86 printk("--------+------+------+--------\n");
87
88 if (listeConditions != NULL) {
89 for (cell = listeConditions->tete; cell != NULL; cell = cell->suivant){
90 printk("0x%x | %4d | %4d | ",
91 cell->condition,
92 cell->condition->nbSignaler,
93 cell->condition->nbDiffuser);
94 for (cellT = cell->condition->tachesEnAttente.tete ;
95 cellT != NULL; cellT = cellT->suivant){
96 printk("%d ", cellT->tache->numero);
97 }
98 printk("\n");
99 }
100 }
101 printk("--------+------+------+--------\n");
102}
103
104#endif // defined(MANUX_CONDITION_AUDIT) && defined(MANUX_KMALLOC)
105
106
111{
113
114#if defined(MANUX_CONDITION_AUDIT)
115 cond->nbSignaler = 0;
116 cond->nbDiffuser = 0;
117
118 if (listeConditions == NULL) {
119 listeConditions = listeConditionsCreer();
120 }
121 if (listeConditions != NULL) {
122 listeConditionsInserer(listeConditions, cond);
123 }
124#endif
125}
126
135{
136 // On se place dans la liste des tâches en attente de la condition
137 // que l'on peut manipuler sans risque car on est protégé par
138 // l'exclusion mutuelle
142
143 // On doit libérer l'exclusion mutuelle et se placer dans l'état
144 // bloqué, on va se rendre non préemptible pour faire ça afin de ne
145 // pas se retrouvée bloquée après avoir été préemptée par une tâche
146 // qui signale la condition !
148
151
153
154 // On est bloquée et préemptible, on peut rendre la main
155 ordonnanceur();
156
157 // Il nous faut ré-acquérir l'exclusion mutuelle
159}
160
169{
170 Tache * ta;
171
172 // Si on trouve une tâche en attente de cette condition
173 // on la réveille.
174 if ((ta = extraireTache(&(cond->tachesEnAttente))) != NULL) {
175 ta->etat = Tache_Prete;
177 ta,
178 (CelluleTache*)ta+sizeof(Tache));
179 }
180#if defined(MANUX_CONDITION_AUDIT)
181 cond->nbSignaler++;
182#endif
183}
184
194{
195 Tache * ta;
196
197 // Si on trouve une tâche en attente de cette condition
198 // on la réveille.
199 while ((ta = extraireTache(&(cond->tachesEnAttente))) != NULL) {
200 ta->etat = Tache_Prete;
202 ta,
203 (CelluleTache*)ta+sizeof(Tache));
204 }
205#if defined(MANUX_CONDITION_AUDIT)
206 cond->nbDiffuser++;
207#endif
208}
209
#define tacheEnCoursAutoriserPreemption()
Autoriser la préemption pour la tâche en cours.
Definition atomique.h:78
#define tacheEnCoursInterdirePreemption()
Empêcher la préemption pour la tâche en cours.
Definition atomique.h:72
void conditionAttendre(Condition *cond, ExclusionMutuelle *em)
Attente de la prochaine occurence d'une condition.
Definition condition.c:134
void conditionInitialiser(Condition *cond)
Initialisation d'une condition.
Definition condition.c:110
void conditionSignaler(Condition *cond)
Signaler une occurence d'une condition.
Definition condition.c:168
void conditionDiffuser(Condition *cond)
Signaler une occurence d'une condition à toutes les tâches en attente.
Definition condition.c:193
void exclusionMutuelleEntrer(ExclusionMutuelle *em)
Entrée en exclusion mutuelle.
void exclusionMutuelleSortir(ExclusionMutuelle *em)
Définition de kmalloc.
void printk(char *format,...)
Fonction principale d'affichage dans le noyau.
Definition printk.c:166
#define NULL
Definition stddef.h:10
void * kmalloc(size_t n)
Allocation d'une zone de n octets.
Definition kmalloc-zs.c:139
void insererCelluleTache(ListeTache *listeTaches, struct _Tache *tache, CelluleTache *celluleTache)
Definition listetaches.c:17
struct _Tache * extraireTache(ListeTache *listeTaches)
Definition listetaches.c:46
void initialiserListeTache(ListeTache *listeTache)
Definition listetaches.c:11
uint16_t c
#define assert(cond)
Definition debug.h:126
ListeTache listeTachesPretes
: La liste des tâches prêtes sur le système
Definition scheduler.c:76
Tache * tacheEnCours
: L'identification de la tâche en cours
Definition scheduler.c:91
void ordonnanceur(void)
Basculer vers la prochaine tache à exécuter.
Definition scheduler.c:98
struct _Tache * tache
Definition listetaches.h:14
struct _CelluleTache * suivant
Definition listetaches.h:15
Définition des exclusions mutuelles.
: Définition du type décrivant une tache.
Definition tache.h:83
EtatTache etat
Definition tache.h:89
TacheID numero
Definition tache.h:88
Définition des conditions.
Definition condition.h:18
ListeTache tachesEnAttente
Definition condition.h:19
@ Tache_Bloquee
Definition tache.h:31
@ Tache_Prete
Definition tache.h:30