block_pool->avail = n_blocks;
}
+// note: size argument can be negative, indicates a no-op
bool block_pool_alloc(struct block_pool *block_pool, int *table, int size) {
int i, j, k;
uint8_t c;
assert(table[i] == 0x55555555);
#endif
//printf("block_pool %p table+i %p alloc %d\n", block_pool, table + i, block_pool->next);
- fflush(stdout);
table[i] = block_pool->next++;
if (block_pool->next >= block_pool->n_blocks)
block_pool->next = 0;
}
- block_pool->avail -= size;
+ block_pool->avail -= i;
return true;
}
+// note: size argument can be negative, indicates a no-op
void block_pool_free(struct block_pool *block_pool, int *table, int size) {
int i, j, k;
for (i = 0; i < size; ++i) {
j = table[i];
//printf("block_pool %p table+i %p free %d\n", block_pool, table + i, j);
- fflush(stdout);
assert(j >= 0 && j < block_pool->n_blocks);
k = j & 7;
j >>= 3;
#endif
}
- block_pool->avail += size;
+ block_pool->avail += i;
}
victim = NULL;
}
+// note: swap_out argument can be negative, indicates a no-op
static bool do_swap_out(int swap_out) {
int victim_core_blocks;
int blocks, swap_base, core_base;
)
);
#else /* INDIRECT_CORE */
+ // 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
+ );
+
// reallocate core and possible swap
if (
!pool_alloc(
dir | POOL_ALLOC_MODE_REALLOC
)
) {
+ assert(blocks_change >= 0);
pool_free(&swap_table, &process->swap_item);
rassert(
pool_alloc(
return false;
}
- if (blocks_change < 0)
- // discard physical blocks as needed
- block_pool_free(
+ // free up as much core as we need to
+ rassert(do_swap_out(blocks_change - core_block_pool.avail));
+
+ // populate physical blocks as needed
+ rassert(
+ block_pool_alloc(
&core_block_pool,
core_table_mem + (
dir ?
- process->core_item.base + blocks_change :
- process->core_item.limit
+ process->core_item.base :
+ process->core_item.limit - blocks_change
),
- -blocks_change
- );
- else {
- // free up as much core as we need to
- rassert(do_swap_out(blocks_change - core_block_pool.avail));
-
- // populate physical blocks as needed
- rassert(
- block_pool_alloc(
- &core_block_pool,
- core_table_mem + (
- dir ?
- process->core_item.base :
- process->core_item.limit - blocks_change
- ),
- blocks_change
- )
- );
- }
+ blocks_change
+ )
+ );
#endif /* INDIRECT_CORE */
// track total allocation