diff --git a/libCacheSim/cache/eviction/ARC.c b/libCacheSim/cache/eviction/ARC.c index 367d5d63..ad82cfd0 100644 --- a/libCacheSim/cache/eviction/ARC.c +++ b/libCacheSim/cache/eviction/ARC.c @@ -222,14 +222,14 @@ static cache_obj_t *ARC_find(cache_t *cache, const request_t *req, cache_obj_t *obj = cache_find_base(cache, req, update_cache); - if (!update_cache) { - return obj->ARC.ghost ? NULL : obj; - } - if (obj == NULL) { return NULL; } + if (!update_cache) { + return obj->ARC.ghost ? NULL : obj; + } + params->curr_obj_in_L1_ghost = false; params->curr_obj_in_L2_ghost = false; diff --git a/libCacheSim/cache/eviction/LRUProb.c b/libCacheSim/cache/eviction/LRUProb.c index b8ca7bd2..5127f127 100644 --- a/libCacheSim/cache/eviction/LRUProb.c +++ b/libCacheSim/cache/eviction/LRUProb.c @@ -25,6 +25,8 @@ typedef struct LRU_Prob_params { int threshold; } LRU_Prob_params_t; +static const char *DEFAULT_CACHE_PARAMS = "prob=0.5"; + // *********************************************************************** // **** **** // **** function declarations **** @@ -77,8 +79,10 @@ cache_t *LRU_Prob_init(const common_cache_params_t ccache_params, cache->eviction_params = (LRU_Prob_params_t *)malloc(sizeof(LRU_Prob_params_t)); LRU_Prob_params_t *params = (LRU_Prob_params_t *)(cache->eviction_params); - params->prob = 0.5; + params->q_head = NULL; + params->q_tail = NULL; + LRU_Prob_parse_params(cache, DEFAULT_CACHE_PARAMS); if (cache_specific_params != NULL) { LRU_Prob_parse_params(cache, cache_specific_params); } @@ -169,6 +173,7 @@ static cache_obj_t *LRU_Prob_find(cache_t *cache, const request_t *req, */ static cache_obj_t *LRU_Prob_insert(cache_t *cache, const request_t *req) { LRU_Prob_params_t *params = (LRU_Prob_params_t *)cache->eviction_params; + cache_obj_t *obj = cache_insert_base(cache, req); prepend_obj_to_head(¶ms->q_head, ¶ms->q_tail, obj); @@ -203,6 +208,8 @@ static cache_obj_t *LRU_Prob_to_evict(cache_t *cache, const request_t *req) { static void LRU_Prob_evict(cache_t *cache, const request_t *req) { LRU_Prob_params_t *params = (LRU_Prob_params_t *)cache->eviction_params; cache_obj_t *obj_to_evict = params->q_tail; + DEBUG_ASSERT(params->q_tail != NULL); + remove_obj_from_list(¶ms->q_head, ¶ms->q_tail, obj_to_evict); cache_remove_obj_base(cache, obj_to_evict, true); } diff --git a/libCacheSim/cache/eviction/SR_LRU.c b/libCacheSim/cache/eviction/SR_LRU.c index 86b9e3d1..700992d6 100644 --- a/libCacheSim/cache/eviction/SR_LRU.c +++ b/libCacheSim/cache/eviction/SR_LRU.c @@ -208,9 +208,13 @@ static cache_obj_t *SR_LRU_find(cache_t *cache, const request_t *req, params->C_demoted -= 1; } - if (cache_hit_R || cache_hit_SR) { + if (cache_hit_R || (cache_hit_SR && likely(update_cache))) { + // if not update_cache obj_SR will not be updated to obj_R DEBUG_ASSERT(obj_R != NULL); return obj_R; + } else if (cache_hit_SR) { + // if not update_cache, directly return obj_SR + return obj_SR; } return NULL; }