return true;
}
-bool process_realloc(struct process *process, int para_base_limit, bool dir) {
- int old_blocks, blocks, blocks_change;
+bool process_realloc(
+ struct process *process,
+ int para_base,
+ int para_limit,
+ bool dir
+) {
+ struct process_calc calc;
+ int old_blocks, block_base, block_limit, blocks, blocks_change;
// must be already allocated
assert(process->flags & PROCESS_FLAGS_ACTIVE);
// must be fully in core
#ifndef INDIRECT_CORE
assert(process->flags & PROCESS_FLAGS_CORE_ITEM);
- assert(
- process->core_item.limit - process->core_item.base ==
- process->swap_item.limit - process->swap_item.base
- );
-#else
- assert(
- process->in_core_block ==
- (process->para_limit + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT
- );
#endif /* ! INDIRECT_CORE */
+ process_calc(process, &calc);
+ assert(calc.in_core_block == calc.block_limit);
// check blocks
- old_blocks = calc_blocks(process->para_base, process->para_limit);
- blocks =
- dir ?
- calc_blocks(para_base_limit, process->para_limit) :
- calc_blocks(process->para_base, para_base_limit);
+ old_blocks = calc.block_limit - calc.block_base;
+ block_base = para_base >> BLOCK_PARAS_SHIFT;
+ block_limit = (para_limit + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
+ blocks = block_limit - block_base;
blocks_change = blocks - old_blocks;
if (process_avail < blocks_change)
return false;
// discard physical blocks as needed
block_pool_free(
&core_block_pool,
- core_table_mem + (
- dir ?
- process->core_item.base :
- process->core_item.limit + blocks_change
- ),
- -blocks_change
+ core_table_mem + calc.core_origin + calc.block_base,
+ block_base - calc.block_base
+ );
+ block_pool_free(
+ &core_block_pool,
+ core_table_mem + calc.core_origin + block_limit,
+ calc.block_limit - block_limit
);
// reallocate core
);
return false;
}
+ calc.core_origin = process->core_item.base - block_base;
// free up as much core as we need to
rassert(do_swap_out(blocks_change - core_block_pool.avail));
rassert(
block_pool_alloc(
&core_block_pool,
- core_table_mem + (
- dir ?
- process->core_item.base :
- process->core_item.limit - blocks_change
- ),
- blocks_change
+ core_table_mem + calc.core_origin + block_base,
+ calc.block_base - block_base
+ ) &&
+ block_pool_alloc(
+ &core_block_pool,
+ core_table_mem + calc.core_origin + calc.block_limit,
+ block_limit - calc.block_limit
)
);
#endif /* INDIRECT_CORE */
// track total allocation
- *(dir ? &process->para_base : &process->para_limit) = para_base_limit;
+ process->para_base = para_base;
+ process->para_limit = para_limit;
#ifdef INDIRECT_CORE
- process->in_core_block =
- (process->para_limit + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
+ process->in_core_block = block_limit;
#endif
process_avail -= blocks_change;
return true;
extern struct lru_item lru_head, *victim;
void process_init(int n, int spare);
-bool process_alloc(struct process *process, int para, int paras);
-bool process_realloc(struct process *process, int paras, bool dir);
+bool process_alloc(struct process *process, int para_base, int para_limit);
+bool process_realloc(
+ struct process *process,
+ int para_base,
+ int para_limit,
+ bool dir
+);
void process_run(struct process *process);
void process_free(struct process *process);
void process_calc(struct process *process, struct process_calc *calc);
old_para_limit - test.para_limit,
test.para_limit - process->para_base
);
- result = process_realloc(process, test.para_limit, false);
+ result = process_realloc(
+ process,
+ process->para_base,
+ test.para_limit,
+ false
+ );
printf(
"... %s\n",
result == test.success ?
if (result) {
if (!test.success) {
printf("... undo\n");
- rassert(process_realloc(process, old_para_limit, false));
+ rassert(
+ process_realloc(
+ process,
+ process->para_base,
+ old_para_limit,
+ false
+ )
+ );
}
else {
process_calc(process, &calc);
test.para_base - old_para_base,
0
);
- result = process_realloc(process, test.para_base, true);
+ result = process_realloc(
+ process,
+ test.para_base,
+ process->para_limit,
+ true
+ );
printf(
"... %s\n",
result == test.success ?
if (result) {
if (!test.success) {
printf("... undo\n");
- rassert(process_realloc(process, old_para_base, true));
+ rassert(
+ process_realloc(
+ process,
+ old_para_base,
+ process->para_limit,
+ true
+ )
+ );
}
else {
process_calc(process, &calc);