11 #include "process_test.h"
16 #define TRANSFER_SIZE 0x8000
21 void core_hash_init(int process, int base, int paras, int offset) {
24 //printf("core_hash_init %d %d(%d) %d(%d) %d(%d)\n", process, base, base >> BLOCK_PARAS_SHIFT, paras, (paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT, offset, offset >> BLOCK_PARAS_SHIFT);
25 for (i = 0; i < paras; ++i) {
29 (core_table_mem[addr >> BLOCK_PARAS_SHIFT] << BLOCK_PARAS_SHIFT) |
30 (addr & (BLOCK_PARAS - 1));
31 #endif /* INDIRECT_CORE */
32 rassert(core_block_mem[addr] == 0xaaaaaaaa);
33 core_block_mem[addr] = process * 17 + (i + offset) * 29;
37 void core_hash_verify(int process, int base, int paras, int offset) {
40 //printf("core_hash_verify %d %d(%d) %d(%d) %d(%d)\n", process, base, base >> BLOCK_PARAS_SHIFT, paras, (paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT, offset, offset >> BLOCK_PARAS_SHIFT);
41 for (i = 0; i < paras; ++i) {
45 (core_table_mem[addr >> BLOCK_PARAS_SHIFT] << BLOCK_PARAS_SHIFT) |
46 (addr & (BLOCK_PARAS - 1));
47 #endif /* INDIRECT_CORE */
48 rassert(core_block_mem[addr] == process * 17 + (i + offset) * 29);
49 core_block_mem[addr] = 0xaaaaaaaa;
53 void swap_hash_verify(int process, int base, int paras, int offset) {
56 //printf("swap_hash_verify %d %d(%d) %d(%d) %d(%d)\n", process, base, base >> BLOCK_PARAS_SHIFT, paras, (paras + (BLOCK_PARAS - 1)) >> BLOCK_PARAS_SHIFT, offset, offset >> BLOCK_PARAS_SHIFT);
57 for (i = 0; i < paras; ++i) {
61 (swap_table_mem[addr >> BLOCK_PARAS_SHIFT] << BLOCK_PARAS_SHIFT) |
62 (addr & (BLOCK_PARAS - 1));
63 #endif /* INDIRECT_SWAP */
64 rassert(swap_block_mem[addr] == process * 17 + (i + offset) * 29);
65 swap_block_mem[addr] = 0xaaaaaaaa;
70 void core_copy(int src_base, int dest_base, int paras) {
73 //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);
74 for (i = 0; i < paras; ++i) {
75 core_block_mem[dest_base + i] = core_block_mem[src_base + i];
76 core_block_mem[src_base + i] = 0xaaaaaaaa;
80 void core_copy_up(int src_limit, int dest_limit, int paras) {
83 //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);
85 for (i = -1; i >= paras; --i) {
86 core_block_mem[dest_limit + i] = core_block_mem[src_limit + i];
87 core_block_mem[src_limit + i] = 0xaaaaaaaa;
90 #endif /* ! INDIRECT_CORE */
92 // dir == false for read, true for write
93 void swap_read_write(int core_block, int swap_block, int blocks, bool dir) {
96 //printf("swap_read_write core [%d,%d) %s swap [%d,%d)\n", core_block, core_block + blocks, dir ? "->" : "<-", swap_block, swap_block + blocks);
97 core_block <<= BLOCK_PARAS_SHIFT;
98 swap_block <<= BLOCK_PARAS_SHIFT;
99 blocks <<= BLOCK_PARAS_SHIFT;
102 for (i = 0; i < paras; ++i)
103 rassert(swap_block_mem[swap_block + i] == 0xaaaaaaaa);
105 swap_block_mem + swap_block,
106 core_block_mem + core_block,
109 memset(core_block_mem + core_block, 0xaa, paras * sizeof(int));
112 for (i = 0; i < paras; ++i)
113 rassert(core_block_mem[core_block + i] == 0xaaaaaaaa);
115 core_block_mem + core_block,
116 swap_block_mem + swap_block,
119 memset(swap_block_mem + swap_block, 0xaa, paras * sizeof(int));
124 int main(int argc, char **argv) {
129 #ifndef INDIRECT_CORE
130 #ifndef INDIRECT_SWAP
132 #else /* INDIRECT_SWAP */
133 int swap_table_blocks;
135 #endif /* INDIRECT_SWAP */
136 #else /* INDIRECT_CORE */
137 int core_table_blocks;
139 int swap_table_blocks;
140 #endif /* INDIRECT_SWAP */
142 #endif /* INDIRECT_CORE */
143 struct process_test test;
147 struct process *process;
149 int old_para_base, old_para_limit;
150 struct process_calc calc;
155 "usage: %s n_processes n_core_blocks "
158 #ifndef INDIRECT_CORE
160 "[swap_table_blocks]"
161 #endif /* INDIRECT_SWAP */
162 #else /* INDIRECT_CORE */
163 #ifndef INDIRECT_SWAP
164 "[core_table_blocks]"
165 #else /* INDIRECT_SWAP */
166 "[core_table_blocks [swap_table_blocks]]"
167 #endif /* INDIRECT_SWAP */
168 #endif /* INDIRECT_CORE */
174 n_processes = atoi(argv[1]);
175 n_core_blocks = atoi(argv[2]);
176 n_swap_blocks = atoi(argv[3]);
177 spare = atoi(argv[4]);
178 #ifndef INDIRECT_CORE
180 swap_table_blocks = argc >= 6 ? atoi(argv[5]) : n_swap_blocks;
181 #endif /* INDIRECT_SWAP */
182 #else /* INDIRECT_CORE */
183 core_table_blocks = argc >= 6 ? atoi(argv[5]) : n_core_blocks;
185 swap_table_blocks = argc >= 7 ? atoi(argv[6]) : n_swap_blocks;
186 #endif /* INDIRECT_SWAP */
187 #endif /* INDIRECT_CORE */
189 #ifndef INDIRECT_CORE
190 core_init(n_core_blocks);
191 #else /* INDIRECT_CORE */
192 core_init(n_core_blocks, core_table_blocks);
193 #endif /* INDIRECT_CORE */
194 core_block_mem = malloc(n_core_blocks * (BLOCK_PARAS * sizeof(int)));
195 rassert(core_block_mem);
196 memset(core_block_mem, 0xaa, n_core_blocks * (BLOCK_PARAS * sizeof(int)));
198 #ifndef INDIRECT_SWAP
199 swap_init(n_swap_blocks);
200 #else /* INDIRECT_SWAP */
201 swap_init(n_swap_blocks, swap_table_blocks);
202 #endif /* INDIRECT_SWAP */
203 swap_block_mem = malloc(n_swap_blocks * (BLOCK_PARAS * sizeof(int)));
204 rassert(swap_block_mem);
205 memset(swap_block_mem, 0xaa, n_swap_blocks * (BLOCK_PARAS * sizeof(int)));
207 process_init(n_processes, spare);
210 //printf("avail %d %d(%d) %d(%d)\n", process_avail, CORE_AVAIL, core_table.avail, SWAP_AVAIL, swap_table.avail);
212 if (read(0, &test, sizeof(test)) != sizeof(test))
215 switch ((unsigned int)scanf("%s", buf)) { // cast because of ACK bug
223 if (strcmp(buf, "alloc") == 0) {
224 test.type = PROCESS_TEST_TYPE_ALLOC;
234 rassert(test.process >= 0 && test.process < n_processes);
235 rassert(test.para_limit >= test.para_base);
236 if (strcmp(buf, "false") == 0)
237 test.success = false;
238 else if (strcmp(buf, "true") == 0)
243 else if (strcmp(buf, "realloc") == 0) {
244 test.type = PROCESS_TEST_TYPE_REALLOC;
249 &test.old_para_limit,
254 rassert(test.process >= 0 && test.process < n_processes);
255 if (strcmp(buf, "false") == 0)
256 test.success = false;
257 else if (strcmp(buf, "true") == 0)
262 else if (strcmp(buf, "realloc_base") == 0) {
263 test.type = PROCESS_TEST_TYPE_REALLOC_BASE;
273 rassert(test.process >= 0 && test.process < n_processes);
274 if (strcmp(buf, "false") == 0)
275 test.success = false;
276 else if (strcmp(buf, "true") == 0)
281 else if (strcmp(buf, "run") == 0) {
282 test.type = PROCESS_TEST_TYPE_RUN;
283 rassert(scanf("%d", &test.process) == 1);
284 rassert(test.process >= 0 && test.process < n_processes);
286 else if (strcmp(buf, "free") == 0) {
287 test.type = PROCESS_TEST_TYPE_FREE;
296 rassert(test.process >= 0 && test.process < n_processes);
297 rassert(test.old_para_limit >= test.old_para_base);
302 process = processes + test.process;
304 case PROCESS_TEST_TYPE_ALLOC:
306 "alloc %d %d %d %s\n",
310 test.success ? "true" : "false"
312 rassert((process->flags & PROCESS_FLAGS_ACTIVE) == 0);
313 result = process_alloc(process, test.para_base, test.para_limit, 0);
316 result == test.success ?
318 result ? "succeeded, should fail" : "failed, should succeed"
322 printf("... undo\n");
323 process_free(process);
326 process_calc(process, &calc);
327 printf("new core [%d,%d) swap [%d,%d)\n", calc.block_base + calc.core_origin, calc.in_core_block + calc.core_origin, calc.in_core_block + calc.swap_origin, calc.block_limit + calc.swap_origin);
330 (calc.core_origin << BLOCK_PARAS_SHIFT) + test.para_base,
331 test.para_limit - test.para_base,
337 case PROCESS_TEST_TYPE_REALLOC:
339 "realloc %d %d %d %s\n",
343 test.success ? "true" : "false"
345 if ((process->flags & PROCESS_FLAGS_ACTIVE) == 0)
346 printf("... not allocated, ignore\n");
347 else if (test.para_limit < process->para_base)
348 printf("... new limit < base, ignore\n");
350 old_para_limit = process->para_limit;
351 if (old_para_limit != test.old_para_limit)
353 "... old para limit %d, should be %d\n",
357 process_calc(process, &calc);
358 printf("old core [%d,%d) swap [%d,%d)\n", calc.block_base + calc.core_origin, calc.in_core_block + calc.core_origin, calc.in_core_block + calc.swap_origin, calc.block_limit + calc.swap_origin);
361 (calc.core_origin << BLOCK_PARAS_SHIFT) + test.para_limit,
362 old_para_limit - test.para_limit,
363 test.para_limit - process->para_base
365 result = process_alloc(
369 PROCESS_ALLOC_MODE_REALLOC
373 result == test.success ?
375 result ? "succeeded, should fail" : "failed, should succeed"
379 printf("... undo\n");
385 PROCESS_ALLOC_MODE_REALLOC
390 process_calc(process, &calc);
391 printf("new core [%d,%d) swap [%d,%d)\n", calc.block_base + calc.core_origin, calc.in_core_block + calc.core_origin, calc.in_core_block + calc.swap_origin, calc.block_limit + calc.swap_origin);
394 (calc.core_origin << BLOCK_PARAS_SHIFT) + old_para_limit,
395 test.para_limit - old_para_limit,
396 old_para_limit - process->para_base
402 case PROCESS_TEST_TYPE_REALLOC_BASE:
404 "realloc_base %d %d %d %s\n",
408 test.success ? "true" : "false"
410 if ((process->flags & PROCESS_FLAGS_ACTIVE) == 0)
411 printf("... not allocated, ignore\n");
412 else if (test.para_base > process->para_limit)
413 printf("... new base > limit, ignore\n");
415 old_para_base = process->para_base;
416 if (old_para_base != test.old_para_base)
418 "... old para base %d, should be %d\n",
422 process_calc(process, &calc);
423 printf("old core [%d,%d) swap [%d,%d)\n", calc.block_base + calc.core_origin, calc.in_core_block + calc.core_origin, calc.in_core_block + calc.swap_origin, calc.block_limit + calc.swap_origin);
426 (calc.core_origin << BLOCK_PARAS_SHIFT) + old_para_base,
427 test.para_base - old_para_base,
430 result = process_alloc(
434 PROCESS_ALLOC_MODE_REALLOC | PROCESS_ALLOC_MODE_LAST_FIT
438 result == test.success ?
440 result ? "succeeded, should fail" : "failed, should succeed"
444 printf("... undo\n");
450 PROCESS_ALLOC_MODE_REALLOC | PROCESS_ALLOC_MODE_LAST_FIT
455 process_calc(process, &calc);
456 printf("new core [%d,%d) swap [%d,%d)\n", calc.block_base + calc.core_origin, calc.in_core_block + calc.core_origin, calc.in_core_block + calc.swap_origin, calc.block_limit + calc.swap_origin);
457 if (test.para_base < test.old_para_base)
460 (calc.core_origin << BLOCK_PARAS_SHIFT) + old_para_base,
461 process->para_limit - old_para_base,
467 (calc.core_origin << BLOCK_PARAS_SHIFT) + test.para_base,
468 process->para_limit - test.para_base,
469 test.para_base - old_para_base
473 (calc.core_origin << BLOCK_PARAS_SHIFT) + test.para_base,
474 process->para_limit - test.para_base,
481 case PROCESS_TEST_TYPE_RUN:
482 printf("run %d\n", test.process);
483 if ((process->flags & PROCESS_FLAGS_ACTIVE) == 0)
484 printf("... not allocated, ignore\n");
486 process_run(process);
490 case PROCESS_TEST_TYPE_FREE:
497 if ((process->flags & PROCESS_FLAGS_ACTIVE) == 0)
498 printf("... not allocated, ignore\n");
500 old_para_base = process->para_base;
501 if (old_para_base != test.old_para_base)
503 "... old para base %d, should be %d\n",
507 old_para_limit = process->para_limit;
508 if (old_para_limit != test.old_para_limit)
510 "... old para limit %d, should be %d\n",
514 process_calc(process, &calc);
515 printf("old core [%d,%d) swap [%d,%d)\n", calc.block_base + calc.core_origin, calc.in_core_block + calc.core_origin, calc.in_core_block + calc.swap_origin, calc.block_limit + calc.swap_origin);
516 in_core_para = calc.in_core_block << BLOCK_PARAS_SHIFT;
517 if (in_core_para < process->para_base)
518 in_core_para = process->para_base;
519 else if (in_core_para > process->para_limit)
520 in_core_para = process->para_limit;
523 (calc.core_origin << BLOCK_PARAS_SHIFT) + process->para_base,
524 in_core_para - process->para_base,
529 (calc.swap_origin << BLOCK_PARAS_SHIFT) + in_core_para,
530 process->para_limit - in_core_para,
531 in_core_para - process->para_base
533 process_free(process);
543 printf("final state:\n");
544 for (i = 0; i < n_processes; ++i) {
545 process = processes + i;
546 if ((process->flags & PROCESS_FLAGS_ACTIVE) == 0)
547 printf("process %d: not allocated\n", i);
549 process_calc(process, &calc);
551 "process %d: core [%d,%d) swap [%d,%d)\n",
553 calc.block_base + calc.core_origin,
554 calc.in_core_block + calc.core_origin,
555 calc.in_core_block + calc.swap_origin,
556 calc.block_limit + calc.swap_origin
558 in_core_para = calc.in_core_block << BLOCK_PARAS_SHIFT;
559 if (in_core_para < process->para_base)
560 in_core_para = process->para_base;
561 else if (in_core_para > process->para_limit)
562 in_core_para = process->para_limit;
565 (calc.core_origin << BLOCK_PARAS_SHIFT) + process->para_base,
566 in_core_para - process->para_base,
571 (calc.swap_origin << BLOCK_PARAS_SHIFT) + in_core_para,
572 process->para_limit - in_core_para,
573 in_core_para - process->para_base
575 process_free(process);
580 for (i = 0; i < core_table_blocks; ++i)
581 rassert(core_table_mem[i] == 0x55555555);
583 k = core_block_pool.n_blocks >> 3;
584 for (j = 0; j < k; ++j)
585 rassert(core_block_pool.bitmap[j] == 0xff);
586 k = core_block_pool.n_blocks & 7;
588 rassert(core_block_pool.bitmap[j] == (uint8_t)~(-1 << k));
590 #endif /* INDIRECT_CORE */
591 j = n_core_blocks << BLOCK_PARAS_SHIFT;
592 for (i = 0; i < j; ++i)
593 rassert(core_block_mem[i] == 0xaaaaaaaa);
595 for (i = 0; i < swap_table_blocks; ++i)
596 rassert(swap_table_mem[i] == 0x55555555);
598 k = swap_block_pool.n_blocks >> 3;
599 for (j = 0; j < k; ++j)
600 rassert(swap_block_pool.bitmap[j] == 0xff);
601 k = swap_block_pool.n_blocks & 7;
603 rassert(swap_block_pool.bitmap[j] == (uint8_t)~(-1 << k));
605 #endif /* INDIRECT_SWAP */
606 j = n_swap_blocks << BLOCK_PARAS_SHIFT;
607 for (i = 0; i < j; ++i)
608 rassert(swap_block_mem[i] == 0xaaaaaaaa);