#endif
}
for (int i = 0; i < n_processes; ++i)
- if (processes[i].blocks == -1) {
+ if (processes[i].size == -1L) {
#ifdef PREALLOCATE_CORE
assert(
processes[i].core_item.prev == NULL &&
#else
assert(processes[i].pool_item.prev && processes[i].pool_item.next);
assert(
- processes[i].blocks ==
- processes[i].pool_item.limit -
- processes[i].pool_item.base
+ (int)((processes[i].size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT) ==
+ processes[i].pool_item.limit - processes[i].pool_item.base
);
#endif
}
int victim_swap_blocks = victim_swap_item.limit - victim_swap_item.base;
#endif
assert(victim_swap_blocks);
- assert(processes[i].blocks == victim_core_blocks + victim_swap_blocks);
+ assert(
+ (int)((processes[i].size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT) ==
+ victim_core_blocks + victim_swap_blocks
+ );
}
else {
#ifdef PREALLOCATE_SWAP
#else
assert(processes[i].pool_item.prev && processes[i].pool_item.next);
assert(
- processes[i].blocks ==
- processes[i].pool_item.limit -
- processes[i].pool_item.base
+ (int)((processes[i].size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT) ==
+ processes[i].pool_item.limit - processes[i].pool_item.base
);
#endif
}
- avail -= processes[i].blocks;
+ avail -= (int)((processes[i].size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
}
assert(avail == process_avail);
}
n_processes = n;
#ifndef NDEBUG
for (int i = 0; i < n_processes; ++i)
- processes[i].blocks = -1;
+ processes[i].size = -1L;
#endif
process_avail = core_avail() + swap_avail() - spare;
// fully in core, take over only the per-process core item
#ifdef PREALLOCATE_CORE
- victim_core_blocks = victim->blocks;
+ victim_core_blocks =
+ (int)((victim->size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
#else
pool_move_item(&victim->pool_item, &victim_core_item);
victim_core_blocks = victim_core_item.limit - victim_core_item.base;
- assert(victim_core_blocks == victim->blocks);
+ assert(
+ victim_core_blocks ==
+ (int)((victim->size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT)
+ );
#endif
// calculate amount to swap out
}
}
-bool process_alloc(struct process *process, int blocks) {
- int swap_out;
+bool process_alloc(struct process *process, long size) {
+ int blocks, swap_out;
// must not be already allocated
- assert(process->blocks == -1);
+ assert(process->size == -1L);
// check blocks
+ blocks = (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
if (
process_avail < blocks
#if defined(PREALLOCATE_SWAP) && !defined(MOVEABLE_SWAP)
process->lru_item.next->prev = &process->lru_item;
// track total allocation
- process->blocks = blocks;
+ process->size = size;
process_avail -= blocks;
check_invariants();
return true;
}
-bool process_realloc(struct process *process, int blocks) {
- int swap_out;
+bool process_realloc(struct process *process, long size) {
+ int blocks, old_blocks, swap_out;
// must be already allocated
- assert(process->blocks != -1);
+ assert(process->size != -1L);
// must be fully in core
assert(process->lru_item.prev != NULL);
// check blocks
- int blocks_change = blocks - process->blocks;
+ blocks = (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
+ old_blocks = (int)((process->size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
+ int blocks_change = blocks - old_blocks;
if (process_avail < blocks_change)
return false;
#if defined(PREALLOCATE_SWAP) && !defined(MOVEABLE_SWAP)
swap_table_free(&process->swap_item);
if (!swap_table_alloc(&process->swap_item, blocks)) {
- rassert(swap_table_alloc(&process->swap_item, process->blocks));
+ rassert(swap_table_alloc(&process->swap_item, old_blocks));
return false;
}
#endif
if (!core_table_realloc(&PER_PROCESS_CORE_ITEM(process), blocks)) {
#if defined(PREALLOCATE_SWAP) && !defined(MOVEABLE_SWAP)
swap_table_free(&process->swap_item);
- rassert(swap_table_alloc(&process->swap_item, process->blocks));
+ rassert(swap_table_alloc(&process->swap_item, old_blocks));
#endif
return false;
}
#endif
// track total allocation
- process->blocks = blocks;
+ process->size = size;
process_avail -= blocks_change;
check_invariants();
return true;
int swap_base, core_base;
// must be already allocated
- assert(process->blocks != -1);
+ assert(process->size != -1L);
// see whether fully in core
if (process->lru_item.prev != NULL) {
if (process != victim) {
// fully in swap, take over only the per-process swap item
#ifdef PREALLOCATE_SWAP
- process_swap_blocks = process->blocks;
+ process_swap_blocks =
+ (int)((process->size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
#else
pool_move_item(&process->pool_item, &process_swap_item);
process_swap_blocks = process_swap_item.limit - process_swap_item.base;
- assert(process_swap_blocks == process->blocks);
+ assert(
+ process_swap_blocks ==
+ (int)((process->size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT)
+ );
#endif
// calculate amounts to swap out then in
void process_free(struct process *process) {
// must be already allocated
- assert(process->blocks != -1);
+ assert(process->size != -1L);
// see whether fully in core, victim, or fully in swap
if (process->lru_item.prev != NULL) {
#endif
// track total allocation
- process_avail += process->blocks;
+ process_avail += (int)((process->size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
#ifndef NDEBUG
- process->blocks = -1;
+ process->size = -1L;
#endif
check_invariants();
}
#endif
process_init(n_processes, spare);
for (int i = 0; i < n_processes; ++i)
- processes[i].blocks = -1;
+ processes[i].size = -1L;
while (true) {
//printf("avail %d %d(%d) %d(%d)\n", process_avail, core_avail(), core_table.avail, swap_avail(), swap_table.avail);
size,
success ? "true" : "false"
);
- rassert(processes[process].blocks == -1);
- int blocks = (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
- bool result = process_alloc(processes + process, blocks);
+ rassert(processes[process].size == -1L);
+ bool result = process_alloc(processes + process, size);
printf(
"... %s\n",
result == success ?
if (!success) {
printf("... undo\n");
process_free(processes + process);
- processes[process].blocks = -1;
+ processes[process].size = -1L;
}
else {
int core_base = PER_PROCESS_CORE_ITEM(processes + process).base;
+ int blocks = (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
assert(
PER_PROCESS_CORE_ITEM(processes + process).limit ==
core_base + blocks
size,
success ? "true" : "false"
);
- if (processes[process].blocks == -1)
+ if (processes[process].size == -1L)
printf("... not allocated, ignore\n");
else {
int core_base = PER_PROCESS_CORE_ITEM(processes + process).base;
- int actual_old_blocks = processes[process].blocks;
+ int actual_old_blocks =
+ (int)((processes[process].size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
rassert(
PER_PROCESS_CORE_ITEM(processes + process).limit ==
core_base + actual_old_blocks
#endif
int blocks = (int)((size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
core_hash_verify(process, core_base, blocks, actual_old_blocks);
- bool result = process_realloc(processes + process, blocks);
+ bool result = process_realloc(processes + process, size);
printf(
"... %s\n",
result == success ?
rassert(scanf("%d", &process) == 1);
rassert(process >= 0 && process < n_processes);
printf("run %d\n", process);
- if (processes[process].blocks == -1)
+ if (processes[process].size == -1L)
printf("... not allocated, ignore\n");
else {
process_run(processes + process);
rassert(process >= 0 && process < n_processes);
rassert(old_size >= 0);
printf("free %d %ld\n", process, old_size);
- if (processes[process].blocks == -1)
+ if (processes[process].size == -1L)
printf("... not allocated, ignore\n");
else {
- int actual_old_blocks = processes[process].blocks;
- int old_blocks = (int)((old_size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
+ int actual_old_blocks =
+ (int)((processes[process].size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
+ int old_blocks =
+ (int)((old_size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT);
if (actual_old_blocks != old_blocks) {
printf(
"... old blocks %d, should be %d\n",
);
swap_hash_verify(process, swap_base, 0, swap_blocks);
process_free(processes + process);
- processes[process].blocks = -1;
+ processes[process].size = -1L;
printf("... ok\n");
}
}
done:
printf("final state:\n");
for (int i = 0; i < n_processes; ++i) {
- if (processes[i].blocks == -1)
+ if (processes[i].size == -1L)
printf("process %d: not allocated\n", i);
else {
int swap_base, swap_blocks, core_base, core_blocks;
core_base = -1;
core_blocks = 0;
}
- rassert(core_blocks + swap_blocks == processes[i].blocks);
+ rassert(
+ core_blocks + swap_blocks ==
+ (int)((processes[i].size + (BLOCK_SIZE - 1)) >> BLOCK_SHIFT)
+ );
printf(
"process %d: core [%d,%d) swap [%d,%d)\n",
i,