// note: swap_out argument can be negative, indicates a no-op
static bool do_swap_out(int swap_out) {
struct process *process;
- int core_blocks;
+ int core_blocks, swap_blocks;
int blocks, swap_base, core_base;
int paras;
#ifndef INDIRECT_CORE
// calculate amount to swap out
#ifndef INDIRECT_CORE
- core_blocks =
- process->core_item.limit - process->core_item.base;
+ core_blocks = process->core_item.limit - process->core_item.base;
#else /* INDIRECT_CORE */
- core_blocks =
- process->core_item.limit -
- process->core_item.base -
- process->swap_blocks;
+ core_blocks = process->core_blocks;
#endif /* INDIRECT_CORE */
+ swap_blocks =
+ process->swap_item.limit - process->swap_item.base - core_blocks;
#ifndef INDIRECT_SWAP
blocks = swap_out < core_blocks ? swap_out : core_blocks;
#else /* INDIRECT_SWAP */
// calculate transfer parameters
core_blocks -= blocks;
- process->swap_blocks += blocks;
- swap_base = process->swap_item.limit - process->swap_blocks;
+#ifdef INDIRECT_CORE
+ process->core_blocks = core_blocks;
+#endif
+ swap_blocks += blocks;
+ swap_base = process->swap_item.limit - swap_blocks;
#ifndef INDIRECT_CORE
core_base = process->core_item.limit - blocks;
#else /* INDIRECT_CORE */
- core_base = process->core_item.limit - process->swap_blocks;
+ core_base = process->core_item.limit - swap_blocks;
#endif /* INDIRECT_CORE */
paras = blocks << BLOCK_PARAS_SHIFT;
// report whether aborted due to swap space or user request
return swap_out == blocks;
}
- assert(
- process->swap_blocks ==
- process->swap_item.limit - process->swap_item.base
- );
printf("victimized %d\n", (int)(process - processes));
#ifndef INDIRECT_CORE
#endif /* INDIRECT_CORE */
process->para = para;
process->paras = paras;
- process->swap_blocks = 0;
+#ifdef INDIRECT_CORE
+ process->core_blocks = blocks;
+#endif
process_avail -= blocks;
return true;
}
// 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->core_blocks ==
+ process->swap_item.limit - process->swap_item.base
+ );
#endif /* ! INDIRECT_CORE */
- assert(process->swap_blocks == 0);
// check blocks
old_blocks = process->swap_item.limit - process->swap_item.base;
if (dir)
process->para = (blocks << BLOCK_PARAS_SHIFT) - para - paras;
process->paras = paras;
+#ifdef INDIRECT_CORE
+ process->core_blocks = blocks;
+#endif
process_avail -= blocks_change;
return true;
}
void process_run(struct process *process) {
- int blocks, core_blocks;
+ int core_blocks, swap_blocks, blocks;
int swap_base, core_base;
int paras;
#ifndef INDIRECT_CORE
process->lru_item.prev->next = process->lru_item.next;
process->lru_item.next->prev = process->lru_item.prev;
-#ifndef INDIRECT_CORE
do {
+#ifndef INDIRECT_CORE
core_blocks =
process->flags & PROCESS_FLAGS_CORE_ITEM ?
process->core_item.limit - process->core_item.base :
0;
#else /* INDIRECT_CORE */
- while (process->swap_blocks) {
- core_blocks =
- process->core_item.limit -
- process->core_item.base -
- process->swap_blocks;
+ core_blocks = process->core_blocks;
#endif /* INDIRECT_CORE */
+ swap_blocks =
+ process->swap_item.limit - process->swap_item.base - core_blocks;
// free up as much core as we can
#ifndef INDIRECT_CORE
- do_swap_out(process->swap_blocks - core_table.avail);
+ do_swap_out(swap_blocks - core_table.avail);
blocks = core_table.avail;
#else /* INDIRECT_CORE */
- do_swap_out(process->swap_blocks - core_block_pool.avail);
+ do_swap_out(swap_blocks - core_block_pool.avail);
blocks = core_block_pool.avail;
#endif /* INDIRECT_CORE */
- if (blocks > process->swap_blocks)
- blocks = process->swap_blocks;
+ if (blocks > swap_blocks)
+ blocks = swap_blocks;
#ifndef INDIRECT_CORE
// increase core allocation
#endif /* ! INDIRECT_CORE */
// calculate transfer parameters
- swap_base = process->swap_item.limit - process->swap_blocks;
+ swap_base = process->swap_item.limit - swap_blocks;
#ifndef INDIRECT_CORE
core_base = process->core_item.limit - blocks;
#else /* INDIRECT_CORE */
- core_base = process->core_item.limit - process->swap_blocks;
+ core_base = process->core_item.limit - swap_blocks;
#endif /* INDIRECT_CORE */
core_blocks += blocks;
- process->swap_blocks -= blocks;
+#ifdef INDIRECT_CORE
+ process->core_blocks = core_blocks;
+#endif
+ swap_blocks -= blocks;
paras = blocks << BLOCK_PARAS_SHIFT;
// transfer data to core
printf("\n");
block_pool_free(&swap_block_pool, swap_table_mem + swap_base, blocks);
#endif /* INDIRECT_SWAP */
- } while (process->swap_blocks);
#else /* INDIRECT_CORE */
j = paras >> BLOCK_PARAS_SHIFT;
printf("blocks");
#ifdef INDIRECT_SWAP
block_pool_free(&swap_block_pool, swap_table_mem + swap_base, blocks);
#endif /* INDIRECT_SWAP */
- }
#endif /* INDIRECT_CORE */
+ } while (swap_blocks);
// insert at head of LRU list
process->lru_item.prev = &lru_head;
}
void process_free(struct process *process) {
+#ifdef INDIRECT_SWAP
+ int core_blocks, swap_blocks;
+#endif /* INDIRECT_SWAP */
+
// must be already allocated
assert(process->flags & PROCESS_FLAGS_ACTIVE);
process->lru_item.prev->next = process->lru_item.next;
process->lru_item.next->prev = process->lru_item.prev;
+#ifdef INDIRECT_SWAP
+ // calculate blocks before freeing anything
+#ifndef INDIRECT_CORE
+ core_blocks =
+ process->flags & PROCESS_FLAGS_CORE_ITEM ?
+ process->core_item.limit - process->core_item.base :
+ 0;
+#else /* INDIRECT_CORE */
+ core_blocks = process->core_blocks;
+#endif /* INDIRECT_CORE */
+ swap_blocks =
+ process->swap_item.limit - process->swap_item.base - core_blocks;
+#endif /* INDIRECT_SWAP */
+
// remove from core pool
#ifndef INDIRECT_CORE
if (process->flags & PROCESS_FLAGS_CORE_ITEM)
block_pool_free(
&core_block_pool,
core_table_mem + process->core_item.base,
- process->core_item.limit -
- process->core_item.base -
- process->swap_blocks
+#ifdef INDIRECT_SWAP
+ core_blocks
+#else /* ! INDIRECT_SWAP */
+ process->core_blocks
+#endif /* ! INDIRECT_SWAP */
);
pool_free(&core_table, &process->core_item);
#endif /* INDIRECT_CORE */
#ifdef INDIRECT_SWAP
block_pool_free(
&swap_block_pool,
- swap_table_mem + process->swap_item.limit - process->swap_blocks,
- process->swap_blocks
+ swap_table_mem + process->swap_item.base + core_blocks,
+ swap_blocks
);
#endif /* INDIRECT_SWAP */
pool_free(&swap_table, &process->swap_item);
}
#else /* INDIRECT_CORE */
state->core_base = process->core_item.base;
- state->core_blocks =
- process->core_item.limit -
- process->core_item.base -
- process->swap_blocks;
+ state->core_blocks = process->core_blocks;
#endif /* INDIRECT_CORE */
state->core_para = process->para;
state->core_paras =
if (state->core_paras > process->paras)
state->core_paras = process->paras;
- state->swap_base = process->swap_item.limit - process->swap_blocks;
- state->swap_blocks = process->swap_blocks;
+ state->swap_base =
+ process->swap_item.base + state->core_blocks;
+ state->swap_blocks =
+ process->swap_item.limit - process->swap_item.base - state->core_blocks;
para =
(
(process->swap_item.limit - process->swap_item.base) <<
) - process->para - process->paras;
//printf("a %d+%d+%d=%d*%d\n", process->para, process->paras, para, process->swap_item.limit - process->swap_item.base, BLOCK_PARAS);
state->swap_paras =
- (process->swap_blocks << BLOCK_PARAS_SHIFT) - para;
+ (state->swap_blocks << BLOCK_PARAS_SHIFT) - para;
if (state->swap_paras < 0)
state->swap_paras = 0;
if (state->swap_paras > process->paras)
state->swap_paras = process->paras;
state->swap_para =
- (process->swap_blocks << BLOCK_PARAS_SHIFT) - para - state->swap_paras;
+ (state->swap_blocks << BLOCK_PARAS_SHIFT) - para - state->swap_paras;
//printf("b %d+%d+%d=%d*%d\n", state->swap_para, state->swap_paras, para, process->swap_blocks, BLOCK_PARAS);
}