processes[process].size = -1;
}
else {
-#ifdef PREALLOCATE_CORE
- int core_base = processes[process].core_item.base;
- assert(processes[process].core_item.limit == core_base + size);
-#else
- int core_base = processes[process].pool_item.base;
- assert(processes[process].pool_item.limit == core_base + size);
-#endif
+ int core_base = PER_PROCESS_CORE_ITEM(processes + process).base;
+ assert(
+ PER_PROCESS_CORE_ITEM(processes + process).limit ==
+ core_base + size
+ );
printf("new core [%d,%d)\n", core_base, core_base + size);
core_hash_init(process, core_base, 0, size);
#ifdef PREALLOCATE_SWAP
- printf("new swap [%d,%d)\n", processes[process].swap_item.base, processes[process].swap_item.limit);
+ printf("new swap [%d,%d)\n", PER_PROCESS_SWAP_ITEM(processes + process).base, PER_PROCESS_SWAP_ITEM(processes + process).limit);
#endif
}
}
if (processes[process].size == -1)
printf("... not allocated, ignore\n");
else {
-#ifdef PREALLOCATE_CORE
- int core_base = processes[process].core_item.base;
-#else
- int core_base = processes[process].pool_item.base;
-#endif
+ int core_base = PER_PROCESS_CORE_ITEM(processes + process).base;
int actual_old_size = processes[process].size;
rassert(
-#ifdef PREALLOCATE_CORE
- processes[process].core_item.limit == core_base + actual_old_size
-#else
- processes[process].pool_item.limit == core_base + actual_old_size
-#endif
+ PER_PROCESS_CORE_ITEM(processes + process).limit ==
+ core_base + actual_old_size
);
if (actual_old_size != old_size) {
printf(
rassert(actual_old_size <= old_size);
}
#ifdef PREALLOCATE_SWAP
- printf("old core [%d,%d) swap [%d,%d)\n", core_base, core_base + actual_old_size, processes[process].swap_item.base, processes[process].swap_item.limit);
+ printf("old core [%d,%d) swap [%d,%d)\n", core_base, core_base + actual_old_size, PER_PROCESS_SWAP_ITEM(processes + process).base, PER_PROCESS_SWAP_ITEM(processes + process).limit);
#else
printf("old core [%d,%d)\n", core_base, core_base + actual_old_size);
#endif
rassert(process_realloc(processes + process, actual_old_size));
}
else {
-#ifdef PREALLOCATE_CORE
- core_base = processes[process].core_item.base;
- rassert(processes[process].core_item.limit == core_base + size);
-#else
- core_base = processes[process].pool_item.base;
- rassert(processes[process].pool_item.limit == core_base + size);
-#endif
+ core_base = PER_PROCESS_CORE_ITEM(processes + process).base;
+ rassert(
+ PER_PROCESS_CORE_ITEM(processes + process).limit ==
+ core_base + size
+ );
#ifdef PREALLOCATE_SWAP
- printf("new core [%d,%d) swap [%d,%d)\n", core_base, core_base + size, processes[process].swap_item.base, processes[process].swap_item.limit);
+ printf("new core [%d,%d) swap [%d,%d)\n", core_base, core_base + size, PER_PROCESS_SWAP_ITEM(processes + process).base, PER_PROCESS_SWAP_ITEM(processes + process).limit);
#else
printf("new core [%d,%d)\n", core_base, core_base + size);
#endif
);
rassert(actual_old_size <= old_size);
}
- bool is_victim = processes + process == victim;
- bool in_core = processes[process].lru_item.prev != NULL;
-#ifdef PREALLOCATE_SWAP
- int swap_size =
- is_victim ?
- victim_swap_size :
- !in_core ? processes[process].size : 0;
- int swap_base =
- processes[process].swap_item.base;
-#else
- int swap_base =
- is_victim ?
- victim_swap_item.base :
- !in_core ? processes[process].pool_item.base : -1;
- int swap_size =
- is_victim ?
- victim_swap_item.limit - swap_base :
- !in_core ? processes[process].pool_item.limit - swap_base : 0;
-#endif
-#ifdef PREALLOCATE_CORE
- int core_size =
- is_victim ?
- victim_core_size :
- in_core ? processes[process].size : 0;
- int core_base =
- processes[process].core_item.base + swap_size;
-#else
- int core_base =
- is_victim ?
- victim_core_item.base :
- in_core ? processes[process].pool_item.base : -1;
- int core_size =
- is_victim ?
- victim_core_item.limit - core_base :
- in_core ? processes[process].pool_item.limit - core_base : 0;
-#endif
+ int swap_base, swap_size, core_base, core_size;
+ if (processes[process].lru_item.prev != NULL) { // fully in core
+ assert(processes + process != victim);
+ swap_base = -1;
+ swap_size = 0;
+ core_base =
+ PER_PROCESS_CORE_ITEM(processes + process).base;
+ core_size =
+ PER_PROCESS_CORE_ITEM(processes + process).limit - core_base;
+ }
+ else if (processes + process == victim) { // victim
+ swap_base = DEDICATED_SWAP_ITEM(victim).base;
+ swap_size = DEDICATED_SWAP_SIZE(victim);
+ core_base = DEDICATED_CORE_BASE(victim, swap_size);
+ core_size = DEDICATED_CORE_SIZE(victim);
+ }
+ else { // fully in swap
+ swap_base =
+ PER_PROCESS_SWAP_ITEM(processes + process).base;
+ swap_size =
+ PER_PROCESS_SWAP_ITEM(processes + process).limit - swap_base;
+ core_base = -1;
+ core_size = 0;
+ }
rassert(core_size + swap_size == actual_old_size);
printf("old core [%d,%d) swap [%d,%d)\n", core_base, core_base + core_size, swap_base, swap_base + swap_size);
fflush(stdout);
- core_hash_verify(process, core_base - swap_size, swap_size, swap_size + core_size);
+ core_hash_verify(
+ process,
+ core_base - swap_size,
+ swap_size,
+ swap_size + core_size
+ );
swap_hash_verify(process, swap_base, 0, swap_size);
process_free(processes + process);
processes[process].size = -1;
if (processes[i].size == -1)
printf("process %d: not allocated\n", i);
else {
- bool is_victim = processes + i == victim;
- bool in_core = processes[i].lru_item.prev != NULL;
-#ifdef PREALLOCATE_SWAP
- int swap_size =
- is_victim ?
- victim_swap_size :
- !in_core ? processes[i].size : 0;
- int swap_base =
- processes[i].swap_item.base;
-#else
- int swap_base =
- is_victim ?
- victim_swap_item.base :
- !in_core ? processes[i].pool_item.base : -1;
- int swap_size =
- is_victim ?
- victim_swap_item.limit - swap_base :
- !in_core ? processes[i].pool_item.limit - swap_base : 0;
-#endif
-#ifdef PREALLOCATE_CORE
- int core_size =
- is_victim ?
- victim_core_size :
- in_core ? processes[i].size : 0;
- int core_base =
- processes[i].core_item.base + swap_size;
-#else
- int core_base =
- is_victim ?
- victim_core_item.base :
- in_core ? processes[i].pool_item.base : -1;
- int core_size =
- is_victim ?
- victim_core_item.limit - core_base :
- in_core ? processes[i].pool_item.limit - core_base : 0;
-#endif
+ int swap_base, swap_size, core_base, core_size;
+ if (processes[i].lru_item.prev != NULL) { // fully in core
+ assert(processes + i != victim);
+ swap_base = -1;
+ swap_size = 0;
+ core_base = PER_PROCESS_CORE_ITEM(processes + i).base;
+ core_size = PER_PROCESS_CORE_ITEM(processes + i).limit - core_base;
+ }
+ else if (processes + i == victim) { // victim
+ swap_base = DEDICATED_SWAP_ITEM(victim).base;
+ swap_size = DEDICATED_SWAP_SIZE(victim);
+ core_base = DEDICATED_CORE_BASE(victim, swap_size);
+ core_size = DEDICATED_CORE_SIZE(victim);
+ }
+ else { // fully in swap
+ swap_base = PER_PROCESS_SWAP_ITEM(processes + i).base;
+ swap_size = PER_PROCESS_SWAP_ITEM(processes + i).limit - swap_base;
+ core_base = -1;
+ core_size = 0;
+ }
rassert(core_size + swap_size == processes[i].size);
printf(
"process %d: core [%d,%d) swap [%d,%d)\n",
swap_base,
swap_base + swap_size
);
- core_hash_verify(i, core_base - swap_size, swap_size, swap_size + core_size);
+ core_hash_verify(
+ i,
+ core_base - swap_size,
+ swap_size,
+ swap_size + core_size
+ );
#ifdef INDIRECT_CORE
core_block_free(core_table_mem + core_base, core_size);
#endif