Page principale   Liste par ordre alphabétique   Liste des composants   Liste des fichiers   Composants   Déclarations  

fifo.c

Aller à la documentation de ce fichier.
00001 /**
00002  * \file fifo.c
00003  * Source definissant toutes les fonctions utiles pour manipuler une pile FIFO.
00004  * Et notament pour gerer la liste de processus actifs et l'ordonnancement de leur execution.
00005  */
00006 #include "fifo.h"
00007 
00008 /**
00009  * Initialise une pile
00010  * \param liste : la pile a initialiser
00011  * \return rien
00012  */
00013 void liste_init (l_fifo liste) {
00014   liste.tete = NULL;
00015 }
00016 
00017 /**
00018  * Ajoute un nouveau processus a la pile
00019  * \param liste : la pile ds laquelle il faut ajouter un processus
00020  * \param pid : le num du processus a ajouter
00021  * \return rien
00022  */
00023 void liste_add_pid (l_fifo liste, int pid) {
00024   struct cellule *p_cel; 
00025   struct cellule *p_tmp; 
00026 
00027   // Initialisation de la cellule
00028   p_cel = malloc(sizeof(struct cellule));
00029   p_cel->pid = pid;
00030   p_cel->temps = 0;
00031   p_cel->suivant = NULL;
00032   // Cas de la liste vide
00033   if (liste.tete == NULL) {
00034     liste.tete = p_cel;
00035   }
00036   else { // Liste non vide
00037     p_tmp = liste.tete;
00038     while (p_tmp->suivant) {
00039       p_tmp = p_tmp->suivant;
00040     }
00041     p_tmp->suivant = p_cel;
00042   }
00043 }
00044 
00045 /**
00046  * Retourne le num du processus dont il faut executer une instruction
00047  * \param liste : la pile contenant la liste des proc en cour d'exec
00048  * \return
00049  * - -1 en cas de pile vide
00050  * - le num du processus sinon
00051  */
00052 int liste_next_pid (l_fifo liste){
00053   struct cellule *p_tmp; 
00054 
00055   // Cas de la liste vide
00056   if (liste.tete == NULL) {
00057     fprintf(stderr,"Impossible de determiner le num du prochain processus : la liste est vide\n");
00058     return -1;
00059   }
00060   else{
00061     // Un processus passe la main
00062     if (liste.tete->temps >= quantum) {
00063       liste.tete->temps = 0;
00064       p_tmp = liste.tete;
00065       while (p_tmp->suivant) {
00066         p_tmp = p_tmp->suivant;
00067       }
00068       p_tmp->suivant = liste.tete;
00069       liste.tete = liste.tete->suivant;
00070       liste.tete->suivant = NULL;
00071     }
00072     liste.tete->temps ++;
00073     return liste.tete->pid;
00074   }
00075 }
00076 
00077 /**
00078  * Supprime un processus de la pile
00079  * \param liste : la pile contenant la liste des proc en cour d'exec
00080  * \param pid : le num du processus a supprimer
00081  * \return 
00082  * - -1 en cas de pile vide
00083  * - -2 si il n'y a pas de processus de num pid
00084  * -  0 sinon
00085  */
00086 int liste_supp_pid (l_fifo liste, int pid) {
00087   struct cellule *p_tmp; 
00088   struct cellule *p_clr; 
00089 
00090   // Cas de la liste vide
00091   if (liste.tete == NULL) {
00092     fprintf(stderr,"Impossible de supprimer un element d'une liste vide\n");
00093     return -1;
00094   }
00095   else{
00096     if (liste.tete->pid == pid) {
00097       p_clr = liste.tete;
00098       liste.tete =  liste.tete->suivant;
00099       free (p_clr);
00100       return 0;
00101     }
00102     p_tmp = liste.tete;
00103     while (p_tmp->suivant) {
00104       if (p_tmp->suivant->pid == pid) {
00105         p_clr = p_tmp->suivant;
00106         p_tmp->suivant = p_tmp->suivant->suivant;
00107         free(p_clr);
00108         return 0;
00109       }
00110       p_tmp = p_tmp->suivant;
00111     }
00112     return -2; // Le processus n'a pas ete trouve
00113   }
00114 }    
00115 
00116 /**
00117  * Ajoute une nouvelle page a la pile.
00118  * \param liste : la pile ds laquelle il faut ajouter une page
00119  * \param page : le num de la page a ajouter
00120  * \return rien
00121  */
00122 void liste_add_page (l_fifo liste, int page) {
00123   struct cellule *p_cel; 
00124   struct cellule *p_tmp; 
00125 
00126   // Initialisation de la cellule
00127   p_cel = malloc(sizeof(struct cellule));
00128   p_cel->page = page;
00129   p_cel->suivant = NULL;
00130   // Cas de la liste vide
00131   if (liste.tete == NULL) {
00132     liste.tete = p_cel;
00133   }
00134   else { // Liste non vide
00135     p_tmp = liste.tete;
00136     while (p_tmp->suivant) {
00137       p_tmp = p_tmp->suivant;
00138     }
00139     p_tmp->suivant = p_cel;
00140   }
00141 }
00142 
00143 /**
00144  * Retourne le num de la plus vielle page
00145  * \param liste : la pile contenant la liste des pages physiques de la  memoire principale
00146  * \return
00147  * - -1 en cas d'erreur
00148  * - Le num de la plus vielle page
00149  */
00150 int liste_old_page (l_fifo liste) {
00151   // Cas de la liste vide
00152   if (liste.tete == NULL) {
00153     fprintf(stderr,"Impossible de determiner le num de la plus vielle page : la liste est vide\n");
00154     return -1;
00155   }
00156   else // Liste non vide
00157     return liste.tete->page;
00158 }
00159 
00160 /**
00161  * Quand on accede a une page, elle devient la page la plus 'jeune'. Cette fonction permet 
00162  * d'actualiser l'age de cette page. En fait, on deplace cette page au fond de la pile.
00163  * \param liste : la pile contenant la liste des pages physiques de la  memoire principale
00164  * \param page : le num de la page a deplacer
00165  * \return 
00166  * - -1 en cas de pile vide
00167  * - -2 si il n'y a pas de page de num page
00168  * -  0 sinon
00169  */
00170 int liste_acces_page (l_fifo liste, int page) {
00171   switch (liste_supp_page(liste,page)) {
00172   case -1:
00173     return -1;
00174   case -2:
00175     return -2;
00176   default:
00177     // La page 'page' a ete trouvee et supprimee
00178     // Il faut la rajouter a la fin de la liste
00179     liste_add_page(liste,page);
00180     return 0;
00181   }
00182 }
00183 
00184 /**
00185  * Supprime une page de la pile.
00186  * \param liste : la pile contenant la liste des pages physiques de la  memoire principale
00187  * \param page : le num de la page a supprimer
00188  * \return 
00189  * - -1 en cas de pile vide
00190  * - -2 si il n'y a pas de page de num page
00191  * -  0 sinon
00192  */
00193 int liste_supp_page (l_fifo liste, int page) {
00194   struct cellule *p_tmp; 
00195   struct cellule *p_clr; 
00196 
00197   if (liste.tete == NULL) {  // Cas de la liste vide
00198     fprintf(stderr,"Impossible de supprimer un element d'une liste vide\n");
00199     return -1;
00200   }
00201   if (liste.tete->page == page) {
00202     p_clr = liste.tete;
00203     liste.tete =  liste.tete->suivant;
00204     free (p_clr);
00205     return 0;
00206   }
00207   p_tmp = liste.tete;
00208   while (p_tmp->suivant) {
00209     if (p_tmp->suivant->page == page) {
00210       p_clr = p_tmp->suivant;
00211       p_tmp->suivant = p_tmp->suivant->suivant;
00212       free(p_clr);
00213       return 0;
00214     }
00215     p_tmp = p_tmp->suivant;
00216   }
00217   return -2; // La page n'a pas ete trouvee
00218 }
00219 
00220 /**
00221  * Retourne la taille de la liste
00222  * \param liste : la pile contenant la liste des proc en cour d'execution
00223  * \return 
00224  * La taille de la liste
00225  */
00226 int liste_taille (l_fifo liste) {
00227   struct cellule *p_tmp; 
00228   int taille;
00229 
00230   taille = 0;
00231   p_tmp = liste.tete;
00232   while (p_tmp != NULL) {
00233     taille ++;
00234     p_tmp = p_tmp->suivant;
00235   }
00236   return taille;
00237 }
00238 
00239 /**
00240  * Retourne un tableau d'entiers representant la liste des processus en cours d'utilisation
00241  * \param liste : la pile contenant la liste des proc en cour d'execution
00242  * \return 
00243  * Un pointeur sur un tableau d'entiers representant la liste passee en parametre.
00244  */
00245 int *liste_enum_pid (l_fifo liste) {
00246   struct cellule *p_tmp; 
00247   int * tab;
00248   int taille;
00249   int i;
00250 
00251   taille = liste_taille(liste);
00252   tab = malloc(taille * sizeof(int));
00253   p_tmp = liste.tete;
00254   for (i=0 ; i<taille ; i++) {
00255     tab[i] = p_tmp->pid;
00256     p_tmp = p_tmp->suivant;
00257   }
00258   return tab;
00259 }

Généré le Fri Jun 7 09:49:31 2002 pour KSInu par doxygen1.2.16