test.process = rand_int(n_processes);
test.old_paras = processes[test.process];
if (test.old_paras == -1) {
+ test.old_blocks = -1;
test.paras = rand_int(process_paras + 1);
- int blocks = (test.paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
- test.success = pool_used + blocks <= pool_blocks;
+ test.blocks = (test.paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
+ test.success = pool_used + test.blocks <= pool_blocks;
#ifdef __FUZIX__
test.type = PROCESS_TEST_TYPE_ALLOC;
write(1, &test, sizeof(test));
#else
printf(
- "alloc %d %d %s\n",
+ "alloc %d %d %d %s\n",
test.process,
test.paras,
+ test.blocks,
test.success ? "true" : "false"
);
#endif
if (test.success) {
processes[test.process] = test.paras;
- pool_used += blocks;
+ pool_used += test.blocks;
}
}
else {
- int old_blocks = (test.old_paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
+ test.old_blocks =
+ (test.old_paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
if (rand_int(64)) {
#ifdef __FUZIX__
test.type = PROCESS_TEST_TYPE_RUN;
#endif
if (rand_int(8) == 0) {
- test.paras = rand_int(process_paras + 1);
- int blocks = (test.paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
- test.success = pool_used + blocks - old_blocks <= pool_blocks;
+ test.paras =
+ rand_int(process_paras + 1);
+ test.blocks =
+ (test.paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
+ test.success =
+ pool_used + test.blocks - test.old_blocks <= pool_blocks;
#ifdef __FUZIX__
test.type = PROCESS_TEST_TYPE_REALLOC;
write(1, &test, sizeof(test));
#else
printf(
- "realloc %d %d %d %s\n",
+ "realloc %d %d %d %d %d %s\n",
test.process,
test.old_paras,
+ test.old_blocks,
test.paras,
+ test.blocks,
test.success ? "true" : "false"
);
#endif
if (test.success) {
processes[test.process] = test.paras;
- pool_used += blocks - old_blocks;
+ pool_used += test.blocks - test.old_blocks;
}
}
}
test.type = PROCESS_TEST_TYPE_FREE;
write(1, &test, sizeof(test));
#else
- printf("free %d %d\n", test.process, test.old_paras);
+ printf(
+ "free %d %d %d\n",
+ test.process,
+ test.old_paras,
+ test.old_blocks
+ );
#endif
processes[test.process] = -1;
- pool_used -= old_blocks;
+ pool_used -= test.old_blocks;
}
}
}
void core_copy(int src_base, int dest_base, int paras) {
int i;
- //printf("core_copy %d(%d) %d(%d) %d(%d)\n", src_base, src_base >> BLOCK_PARAS_SHIFT, dest_base, dest_base >> BLOCK_PARAS_SHIFT, paras, (paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT);
+ printf("core_copy %d(%d) %d(%d) %d(%d)\n", src_base, src_base >> BLOCK_PARAS_SHIFT, dest_base, dest_base >> BLOCK_PARAS_SHIFT, paras, (paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT);
for (i = 0; i < paras; ++i) {
core_block_mem[dest_base + i] = core_block_mem[src_base + i];
core_block_mem[src_base + i] = 0xaaaaaaaa;
void core_copy_up(int src_limit, int dest_limit, int paras) {
int i;
- //printf("core_copy_up %d(%d) %d(%d) %d(%d)\n", src_limit, src_limit >> BLOCK_PARAS_SHIFT, dest_limit, dest_limit >> BLOCK_PARAS_SHIFT, paras, (paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT);
+ printf("core_copy_up %d(%d) %d(%d) %d(%d)\n", src_limit, src_limit >> BLOCK_PARAS_SHIFT, dest_limit, dest_limit >> BLOCK_PARAS_SHIFT, paras, (paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT);
paras = -paras;
for (i = -1; i >= paras; --i) {
core_block_mem[dest_limit + i] = core_block_mem[src_limit + i];
char buf[256];
#endif
bool result;
- int actual_old_paras;
- int old_blocks, blocks, actual_old_blocks;
+ int old_paras, old_blocks;
int swap_base, swap_blocks;
int swap_paras;
int core_base, core_blocks;
test.type = PROCESS_TEST_TYPE_ALLOC;
rassert(
scanf(
- "%d %d %s",
+ "%d %d %d %s",
&test.process,
&test.paras,
+ &test.blocks,
buf
- ) == 3
+ ) == 4
);
rassert(test.process >= 0 && test.process < n_processes);
rassert(test.paras >= 0);
+ rassert(test.blocks >= 0);
if (strcmp(buf, "false") == 0)
test.success = false;
else if (strcmp(buf, "true") == 0)
test.type = PROCESS_TEST_TYPE_REALLOC;
rassert(
scanf(
- "%d %d %d %s",
+ "%d %d %d %d %d %s",
&test.process,
&test.old_paras,
+ &test.old_blocks,
&test.paras,
+ &test.blocks,
buf
- ) == 4
+ ) == 6
);
rassert(test.process >= 0 && test.process < n_processes);
rassert(test.old_paras >= 0);
+ rassert(test.old_blocks >= 0);
rassert(test.paras >= 0);
+ rassert(test.blocks >= 0);
if (strcmp(buf, "false") == 0)
test.success = false;
else if (strcmp(buf, "true") == 0)
}
else if (strcmp(buf, "free") == 0) {
test.type = PROCESS_TEST_TYPE_FREE;
- rassert(scanf("%d %d", &test.process, &test.old_paras) == 2);
+ rassert(
+ scanf(
+ "%d %d %d",
+ &test.process,
+ &test.old_paras,
+ &test.old_blocks
+ ) == 3
+ );
rassert(test.process >= 0 && test.process < n_processes);
rassert(test.old_paras >= 0);
+ rassert(test.old_blocks >= 0);
}
else
rassert(false);
switch (test.type) {
case PROCESS_TEST_TYPE_ALLOC:
printf(
- "alloc %d %d %s\n",
+ "alloc %d %d %d %s\n",
test.process,
test.paras,
+ test.blocks,
test.success ? "true" : "false"
);
rassert(processes[test.process].paras == -1);
processes[test.process].paras = -1;
}
else {
- core_base = processes[test.process].core_item.base;
- blocks = (test.paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
- assert(
- processes[test.process].core_item.limit ==
- core_base + blocks
+ printf("new core [%d,%d) swap [%d, %d)\n", processes[test.process].core_item.base, processes[test.process].core_item.limit, processes[test.process].swap_item.base, processes[test.process].swap_item.limit);
+ rassert(
+ processes[test.process].swap_item.limit -
+ processes[test.process].swap_item.base ==
+ test.blocks
);
- printf("new core [%d,%d)\n", core_base, core_base + blocks);
core_hash_init(
test.process,
- core_base << BLOCK_PARAS_SHIFT,
+ processes[test.process].core_item.base << BLOCK_PARAS_SHIFT,
test.paras,
0
);
- printf("new swap [%d,%d)\n", processes[test.process].swap_item.base, processes[test.process].swap_item.limit);
}
}
break;
case PROCESS_TEST_TYPE_REALLOC:
printf(
- "realloc %d %d %d %s\n",
+ "realloc %d %d %d %d %d %s\n",
test.process,
test.old_paras,
+ test.old_blocks,
test.paras,
+ test.blocks,
test.success ? "true" : "false"
);
if (processes[test.process].paras == -1)
printf("... not allocated, ignore\n");
else {
- core_base = processes[test.process].core_item.base;
- actual_old_paras = processes[test.process].paras;
- actual_old_blocks =
- (actual_old_paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
- rassert(
- processes[test.process].core_item.limit ==
- core_base + actual_old_blocks
- );
- old_blocks = (test.old_paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
- if (actual_old_blocks != old_blocks) {
+ printf("old core [%d,%d) swap [%d,%d)\n", processes[test.process].core_item.base, processes[test.process].core_item.limit, processes[test.process].swap_item.base, processes[test.process].swap_item.limit);
+ old_paras = processes[test.process].paras;
+ if (old_paras != test.old_paras) {
+ printf(
+ "... old paras %d, should be %d\n",
+ old_paras,
+ test.old_paras
+ );
+ rassert(old_paras <= test.old_paras);
+ }
+ old_blocks =
+ processes[test.process].swap_item.limit -
+ processes[test.process].swap_item.base;
+ if (old_blocks != test.old_blocks) {
printf(
"... old blocks %d, should be %d\n",
- actual_old_blocks,
- old_blocks
+ old_blocks,
+ test.old_blocks
);
- rassert(actual_old_blocks <= old_blocks);
+ rassert(old_blocks <= test.old_blocks);
}
- printf("old core [%d,%d) swap [%d,%d)\n", core_base, core_base + actual_old_blocks, processes[test.process].swap_item.base, processes[test.process].swap_item.limit);
core_hash_verify(
test.process,
- (core_base << BLOCK_PARAS_SHIFT) + test.paras,
- actual_old_paras - test.paras,
+ (processes[test.process].core_item.base << BLOCK_PARAS_SHIFT) +
+ test.paras,
+ old_paras - test.paras,
test.paras
);
result = process_realloc(processes + test.process, test.paras);
if (result) {
if (!test.success) {
printf("... undo\n");
- rassert(process_realloc(processes + test.process, actual_old_paras));
+ rassert(
+ process_realloc(processes + test.process, old_paras)
+ );
}
else {
- core_base = processes[test.process].core_item.base;
- blocks = (int)((test.paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT);
+ printf("new core [%d,%d) swap [%d, %d)\n", processes[test.process].core_item.base, processes[test.process].core_item.limit, processes[test.process].swap_item.base, processes[test.process].swap_item.limit);
rassert(
- processes[test.process].core_item.limit ==
- core_base + blocks
+ processes[test.process].swap_item.limit -
+ processes[test.process].swap_item.base ==
+ test.blocks
);
- printf("new core [%d,%d) swap [%d,%d)\n", core_base, core_base + blocks, processes[test.process].swap_item.base, processes[test.process].swap_item.limit);
core_hash_init(
test.process,
- (core_base << BLOCK_PARAS_SHIFT) + actual_old_paras,
- test.paras - actual_old_paras,
- actual_old_paras
+ (processes[test.process].core_item.base << BLOCK_PARAS_SHIFT) +
+ old_paras,
+ test.paras - old_paras,
+ old_paras
);
}
}
}
break;
case PROCESS_TEST_TYPE_FREE:
- printf("free %d %d\n", test.process, test.old_paras);
+ printf(
+ "free %d %d %d\n",
+ test.process,
+ test.old_paras,
+ test.old_blocks
+ );
if (processes[test.process].paras == -1)
printf("... not allocated, ignore\n");
else {
- actual_old_blocks =
- (processes[test.process].paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
+ old_paras = processes[test.process].paras;
+ if (old_paras != test.old_paras) {
+ printf(
+ "... old paras %d, should be %d\n",
+ old_paras,
+ test.old_paras
+ );
+ rassert(old_paras <= test.old_paras);
+ }
old_blocks =
- (test.old_paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT;
- if (actual_old_blocks != old_blocks) {
+ processes[test.process].swap_item.limit -
+ processes[test.process].swap_item.base;
+ if (old_blocks != test.old_blocks) {
printf(
"... old blocks %d, should be %d\n",
- actual_old_blocks,
- old_blocks
+ old_blocks,
+ test.old_blocks
);
- rassert(actual_old_blocks <= old_blocks);
+ rassert(old_blocks <= test.old_blocks);
}
if (processes[test.process].lru_item.prev != NULL) { // fully in core
assert(processes + test.process != victim);
swap_paras = processes[test.process].paras;
}
}
- rassert(core_blocks + swap_blocks == actual_old_blocks);
printf("old core [%d,%d) swap [%d,%d)\n", core_base, core_base + core_blocks, swap_base, swap_base + swap_blocks);
fflush(stdout);
core_hash_verify(