My Project
Chargement...
Recherche...
Aucune correspondance
exclusion-mutuelle.c
Aller à la documentation de ce fichier.
1
8#include <manux/stddef.h> // NULL
9#include <manux/debug.h> // assert, ...
10#include <manux/kmalloc.h> // kmalloc, ...
11
12#if defined(MANUX_EXCLUSION_MUTUELLE_AUDIT)
13
18typedef struct _CelluleExclusionMutuelle {
19 ExclusionMutuelle * exclusionMutuelle;
20 struct _CelluleExclusionMutuelle * suivant;
21} CelluleExclusionMutuelle;
22
23typedef struct _ListeExclusionsMutuelles {
24 CelluleExclusionMutuelle * tete;
25 CelluleExclusionMutuelle * queue;
26} ListeExclusionsMutuelles;
27
31static
32ListeExclusionsMutuelles * listeExclusionsMutuellesCreer(void)
33{
34 ListeExclusionsMutuelles * result;
35
36 result = (ListeExclusionsMutuelles *) kmalloc(sizeof(ListeExclusionsMutuelles));
37
38 if (result == NULL) {
39 paniqueNoyau("retour de kmalloc NULL\n");
40 }
41 result->tete = NULL;
42 result->queue = NULL;
43
44 return result;
45}
46
51static
52void listeExclusionsMutuellesInserer(ListeExclusionsMutuelles * l, ExclusionMutuelle * c)
53{
54 CelluleExclusionMutuelle * cell = (CelluleExclusionMutuelle *) kmalloc(sizeof(CelluleExclusionMutuelle));
55
56 assert(l != NULL);
57 assert(c != NULL);
58
59 if (cell != NULL) {
60 cell->exclusionMutuelle = c;
61 cell->suivant = NULL;
62 if (l->queue != NULL) {
63 l->queue->suivant = cell;
64 }
65 l->queue = cell;
66 if (l->tete == NULL) {
67 l->tete = cell;
68 }
69 }
70}
71
75static ListeExclusionsMutuelles * listeExclusionsMutuelles = NULL;
76
80void exclusionsMutuellesAfficherEtat(void)
81{
82 CelluleExclusionMutuelle * cell;
83 CelluleTache * cellT;
84
85 printk("\nEtat des variables d'exclusion mutuelle sur le systeme :\n\n");
86 printk("Excl M | en | so | Attente\n");
87 printk("--------+------+------+--------\n");
88 if (listeExclusionsMutuelles != NULL) {
89 for (cell = listeExclusionsMutuelles->tete; cell != NULL; cell = cell->suivant){
90 printk("0x%x | %4d | %4d | ",
91 cell->exclusionMutuelle,
92 cell->exclusionMutuelle->nbEntrees,
93 cell->exclusionMutuelle->nbSorties);
94 for (cellT = cell->exclusionMutuelle->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_EXCLUSION_MUTUELLE_AUDIT)
105
110{
111 atomiqueInit(&(em->verrou), 0);
113
114#if defined(MANUX_EXCLUSION_MUTUELLE_AUDIT)
115 em->nbEntrees = 0;
116 em->nbSorties = 0;
117
118 if (listeExclusionsMutuelles == NULL) {
119 listeExclusionsMutuelles = listeExclusionsMutuellesCreer();
120 }
121 if (listeExclusionsMutuelles != NULL) {
122 listeExclusionsMutuellesInserer(listeExclusionsMutuelles, em);
123 }
124#endif
125};
126
135{
136 // Tant que je n'acquière pas le verrou ...
137 while (compareEtEchange(&(em->verrou), 0, tacheEnCours->numero)) {
138
139 // ... je me mets en attente. Pour cela, j'interdis la
140 // préeemption de sorte à ne pas me retrouvée dans l'état
141 // bloquées mais référencée dans aucune liste d'attente !
143
148
150
151 // Puisque je suis bloquée, je rends la main
152 ordonnanceur();
153 };
154
155 // Je peux tranquilement modifier le compteur !
156#if defined(MANUX_EXCLUSION_MUTUELLE_AUDIT)
157 em->nbEntrees++;
158#endif
159}
160
162{
163 Tache * ta;
164
165 // Si on trouve une tâche en attente de cette exclusion mutuelle,
166 // on la réveille.
167 if ((ta = extraireTache(&(em->tachesEnAttente))) != NULL) {
168 ta->etat = Tache_Prete;
170 ta,
171 (CelluleTache*)ta+sizeof(Tache));
172 }
173 // Le verrou est encore à nous, on peut modifier les compteurs sans
174 // crainte
175#if defined(MANUX_EXCLUSION_MUTUELLE_AUDIT)
176 (em)->nbSorties++ ;
177#endif
178 // On déverouille
179 atomiqueInit(&(em)->verrou, 0);
180}
#define atomiqueInit(atom, val)
Definition atomique.h:21
#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 exclusionMutuelleEntrer(ExclusionMutuelle *em)
Entrée en exclusion mutuelle.
void exclusionMutuelleInitialiser(ExclusionMutuelle *em)
Initialisation d'une exclusion mutuelle.
void exclusionMutuelleSortir(ExclusionMutuelle *em)
Définition des exlusions mutuelles.
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
#define paniqueNoyau(fmt, args...)
Definition debug.h:107
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
@ Tache_Bloquee
Definition tache.h:31
@ Tache_Prete
Definition tache.h:30