/*! Retrait du dernier élément */ struct Cache_Block_Header *Cache_List_Remove_Last(struct Cache_List *list) { if(Cache_List_Is_Empty(list)) return NULL; while(list->next) list = list->next; struct Cache_Block_Header *cbh = list->pheader; list->prev->next = NULL; free(list); return cbh; }
/*! * LRU : On prend le premier bloc invalide. S'il n'y en a plus, on prend le bloc le moins récemment utilisé. */ 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) return pbh; if (Cache_List_Is_Empty(pcl)) { perror("vide : pas possible"); exit(1); } pbh = Cache_List_Remove_First(pcl); Cache_List_Append(pcl, pbh); return pbh; }