/*! Transférer un élément à la fin */ void Cache_List_Move_To_End(struct Cache_List *list, struct Cache_Block_Header *pbh) { assert(list); Cache_List_Remove(list, pbh); Cache_List_Append(list, pbh); }
//! Algorithme de remplacement de bloc. // Appel si le cache ne possède plus de block libre struct Cache_Block_Header *Strategy_Replace_Block(struct Cache *pcache) { struct Cache_List * blocks = (struct Cache_List *) pcache->pstrategy; struct Cache_Block_Header * block = Get_Free_Block(pcache); if(block!=NULL) { Cache_List_Append( blocks, block); return block; } block = Cache_List_Remove_First(blocks); //on le déplace en bout de ligne Cache_List_Append(blocks, block); //return le plus vieux bloc (premier element de la liste pstrategy) return block; }
struct Cache_Block_Header *Strategy_Replace_Block(struct Cache *pcache) { struct Cache_Block_Header *buffer; struct Cache_List *c_list = C_LIST(pcache); /* S'il existe un cache invalide, on va utiliser celui la */ if ((buffer = Get_Free_Block(pcache)) != NULL) { // Comme on va l'utiliser, on le met en fin de liste Cache_List_Append(c_list, buffer); } else { // On prend le premier de la liste que l'on va retourner buffer = Cache_List_Remove_First(c_list); // Comme on va l'utiliser, on le met en fin de liste Cache_List_Append(c_list, buffer); } return buffer; }
/*! * FIFO : On prend le premier bloc invalide. S'il n'y en a plus, on prend un bloc au hasard. */ struct Cache_Block_Header *Strategy_Replace_Block(struct Cache *pcache) { struct Cache_Block_Header *pbh; /* On cherche d'abord un bloc invalide */ if ((pbh = Get_Free_Block(pcache)) != NULL){ Cache_List_Append(list, pbh); return pbh; } if(Cache_List_Is_Empty(list)){ perror("pas possible"); exit(1); } pbh = Cache_List_Remove_First(list); Cache_List_Append(list, pbh); return pbh; }
/*! * //! Algorithme de remplacement de bloc. * @author Ulysse Riccio */ struct Cache_Block_Header *Strategy_Replace_Block(struct Cache *pcache) { struct Cache_Block_Header *pbh; struct Cache_List *lru_list = (struct Cache_List *) ( (pcache)->pstrategy ); /* On cherche d'abord un bloc invalide */ if ((pbh = Get_Free_Block(pcache)) != NULL) { /*! Insertion d'un élément à la fin */ // Les blocs invalides a mettre dans la queue Cache_List_Append(lru_list, pbh); return pbh; } /*! Retrait du premier élément */ // Sinon on prend le premier bloc de la liste LRU et on le déplace à la fin pbh = Cache_List_Remove_First(lru_list); /*! Insertion d'un élément à la fin */ Cache_List_Append(lru_list, pbh); return pbh; }