00001
00002
00003
00004
00005
00006 #include "fifo.h"
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 void liste_init (l_fifo* liste) {
00018 liste->tete = NULL;
00019 }
00020
00021
00022
00023
00024
00025
00026
00027 void liste_add_pid (l_fifo* liste, int pid) {
00028 struct cellule *p_cel;
00029 struct cellule *p_tmp;
00030
00031
00032 p_cel = malloc(sizeof(struct cellule));
00033 p_cel->pid = pid;
00034 p_cel->temps = 0;
00035 p_cel->suivant = NULL;
00036
00037 if (liste->tete == NULL) {
00038 liste->tete = p_cel;
00039 }
00040 else {
00041 p_tmp = liste->tete;
00042 while (p_tmp->suivant) {
00043 p_tmp = p_tmp->suivant;
00044 }
00045 p_tmp->suivant = p_cel;
00046 }
00047 }
00048
00049
00050
00051
00052
00053
00054
00055
00056 int liste_next_pid (l_fifo* liste){
00057 struct cellule *p_tmp;
00058
00059
00060 if (liste->tete == NULL) {
00061 fprintf(stderr,"Impossible de determiner le num du prochain processus : la liste est vide\n");
00062 return -1;
00063 }
00064 else{
00065
00066 if (liste->tete->temps >= quantum) {
00067 liste->tete->temps = 0;
00068 p_tmp = liste->tete;
00069 while (p_tmp->suivant) {
00070 p_tmp = p_tmp->suivant;
00071 }
00072 p_tmp->suivant = liste->tete;
00073 liste->tete = liste->tete->suivant;
00074 p_tmp->suivant->suivant = NULL;
00075 }
00076 liste->tete->temps ++;
00077 return liste->tete->pid;
00078 }
00079 }
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 int liste_supp_pid (l_fifo* liste, int pid) {
00091 struct cellule *p_tmp;
00092 struct cellule *p_clr;
00093
00094
00095 if (liste->tete == NULL) {
00096 fprintf(stderr,"Impossible de supprimer un element d'une liste vide\n");
00097 return -1;
00098 }
00099 else{
00100 if (liste->tete->pid == pid) {
00101 p_clr = liste->tete;
00102 liste->tete = liste->tete->suivant;
00103 free (p_clr);
00104 return 0;
00105 }
00106 p_tmp = liste->tete;
00107 while (p_tmp->suivant) {
00108 if (p_tmp->suivant->pid == pid) {
00109 p_clr = p_tmp->suivant;
00110 p_tmp->suivant = p_tmp->suivant->suivant;
00111 free(p_clr);
00112 return 0;
00113 }
00114 p_tmp = p_tmp->suivant;
00115 }
00116 return -2;
00117 }
00118 }
00119
00120
00121
00122
00123
00124
00125
00126 void liste_add_page (l_fifo* liste, int page) {
00127 struct cellule *p_cel;
00128 struct cellule *p_tmp;
00129
00130
00131 p_cel = malloc(sizeof(struct cellule));
00132 p_cel->page = page;
00133 p_cel->suivant = NULL;
00134
00135 if (liste->tete == NULL) {
00136 liste->tete = p_cel;
00137 }
00138 else {
00139 p_tmp = liste->tete;
00140 while (p_tmp->suivant) {
00141 p_tmp = p_tmp->suivant;
00142 }
00143 p_tmp->suivant = p_cel;
00144 }
00145 }
00146
00147
00148
00149
00150
00151
00152
00153
00154 int liste_old_page (l_fifo* liste) {
00155
00156 if (liste->tete == NULL) {
00157 fprintf(stderr,"Impossible de determiner le num de la plus vielle page : la liste est vide\n");
00158 return -1;
00159 }
00160 else
00161 return liste->tete->page;
00162 }
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 int liste_acces_page (l_fifo* liste, int page) {
00175 switch (liste_supp_page(liste,page)) {
00176 case -1:
00177 return -1;
00178 case -2:
00179 return -2;
00180 default:
00181
00182
00183 liste_add_page(liste,page);
00184 return 0;
00185 }
00186 }
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 int liste_supp_page (l_fifo* liste, int page) {
00198 struct cellule *p_tmp;
00199 struct cellule *p_clr;
00200
00201 if (liste->tete == NULL) {
00202 fprintf(stderr,"Impossible de supprimer un element d'une liste vide\n");
00203 return -1;
00204 }
00205 if (liste->tete->page == page) {
00206 p_clr = liste->tete;
00207 liste->tete = liste->tete->suivant;
00208 free (p_clr);
00209 return 0;
00210 }
00211 p_tmp = liste->tete;
00212 while (p_tmp->suivant) {
00213 if (p_tmp->suivant->page == page) {
00214 p_clr = p_tmp->suivant;
00215 p_tmp->suivant = p_tmp->suivant->suivant;
00216 free(p_clr);
00217 return 0;
00218 }
00219 p_tmp = p_tmp->suivant;
00220 }
00221 return -2;
00222 }
00223
00224
00225
00226
00227
00228
00229
00230 int liste_taille (l_fifo* liste) {
00231 struct cellule *p_tmp;
00232 int taille;
00233
00234 taille = 0;
00235 p_tmp = liste->tete;
00236 while (p_tmp != NULL) {
00237 taille ++;
00238 p_tmp = p_tmp->suivant;
00239 }
00240 return taille;
00241 }
00242
00243
00244
00245
00246
00247
00248
00249 int *liste_enum_pid (l_fifo* liste) {
00250 struct cellule *p_tmp;
00251 int * tab;
00252 int taille;
00253 int i;
00254
00255 taille = liste_taille(liste);
00256 tab = malloc(taille * sizeof(int));
00257 p_tmp = liste->tete;
00258 for (i=0 ; i<taille ; i++) {
00259 tab[i] = p_tmp->pid;
00260 p_tmp = p_tmp->suivant;
00261 }
00262 return tab;
00263 }