00001
00002
00003
00004
00005
00006 #include "fifo.h"
00007
00008
00009
00010
00011
00012
00013 void liste_init (l_fifo liste) {
00014 liste.tete = NULL;
00015 }
00016
00017
00018
00019
00020
00021
00022
00023 void liste_add_pid (l_fifo liste, int pid) {
00024 struct cellule *p_cel;
00025 struct cellule *p_tmp;
00026
00027
00028 p_cel = malloc(sizeof(struct cellule));
00029 p_cel->pid = pid;
00030 p_cel->temps = 0;
00031 p_cel->suivant = NULL;
00032
00033 if (liste.tete == NULL) {
00034 liste.tete = p_cel;
00035 }
00036 else {
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
00047
00048
00049
00050
00051
00052 int liste_next_pid (l_fifo liste){
00053 struct cellule *p_tmp;
00054
00055
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
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
00079
00080
00081
00082
00083
00084
00085
00086 int liste_supp_pid (l_fifo liste, int pid) {
00087 struct cellule *p_tmp;
00088 struct cellule *p_clr;
00089
00090
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;
00113 }
00114 }
00115
00116
00117
00118
00119
00120
00121
00122 void liste_add_page (l_fifo liste, int page) {
00123 struct cellule *p_cel;
00124 struct cellule *p_tmp;
00125
00126
00127 p_cel = malloc(sizeof(struct cellule));
00128 p_cel->page = page;
00129 p_cel->suivant = NULL;
00130
00131 if (liste.tete == NULL) {
00132 liste.tete = p_cel;
00133 }
00134 else {
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
00145
00146
00147
00148
00149
00150 int liste_old_page (l_fifo liste) {
00151
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
00157 return liste.tete->page;
00158 }
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
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
00178
00179 liste_add_page(liste,page);
00180 return 0;
00181 }
00182 }
00183
00184
00185
00186
00187
00188
00189
00190
00191
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) {
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;
00218 }
00219
00220
00221
00222
00223
00224
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
00241
00242
00243
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 }