| 392 | } |
| 393 | |
| 394 | static void ClockPro_run_hot(cache_t *cache) { |
| 395 | ClockPro_params_t *params = (ClockPro_params_t *)cache->eviction_params; |
| 396 | cache_obj_t *obj = params->hand_hot; |
| 397 | |
| 398 | if (obj->clockpro.status != CLOCKPRO_HOT) { |
| 399 | params->hand_hot = obj->queue.next; |
| 400 | return; |
| 401 | } |
| 402 | |
| 403 | if (obj->clockpro.referenced) { |
| 404 | obj->clockpro.referenced = false; |
| 405 | params->hand_hot = obj->queue.next; |
| 406 | return; |
| 407 | } |
| 408 | |
| 409 | while (params->mem_cold + obj->obj_size > params->mem_cold_max) { |
| 410 | ClockPro_run_cold(cache); |
| 411 | } |
| 412 | |
| 413 | obj->clockpro.status = CLOCKPRO_COLD; |
| 414 | obj->clockpro.referenced = params->init_ref; |
| 415 | |
| 416 | if (params->hand_cold == obj) { |
| 417 | params->hand_cold = obj->queue.next; |
| 418 | } |
| 419 | if (params->hand_test == obj) { |
| 420 | params->hand_test = obj->queue.next; |
| 421 | } |
| 422 | |
| 423 | cache_obj_t *hand_hot_next = params->hand_hot->queue.next; |
| 424 | move_obj_to_tail(&hand_hot_next, ¶ms->hand_hot, obj); |
| 425 | params->hand_hot = obj->queue.next; |
| 426 | |
| 427 | params->mem_hot -= obj->obj_size; |
| 428 | params->mem_cold += obj->obj_size; |
| 429 | } |
| 430 | |
| 431 | static void ClockPro_promote(cache_t *cache, cache_obj_t *obj) { |
| 432 | ClockPro_params_t *params = (ClockPro_params_t *)cache->eviction_params; |
no test coverage detected