|
411 | 411 | pid_t child = 1; \ |
412 | 412 | int status = 0; \ |
413 | 413 | /* Makes sure there is only one teardown, even when child forks again. */ \ |
414 | | - bool *teardown = mmap(NULL, sizeof(*teardown), \ |
| 414 | + _metadata->no_teardown = mmap(NULL, sizeof(*_metadata->no_teardown), \ |
415 | 415 | PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); \ |
416 | | - *teardown = false; \ |
| 416 | + *_metadata->no_teardown = true; \ |
417 | 417 | if (sizeof(*self) > 0) { \ |
418 | 418 | if (fixture_name##_teardown_parent) { \ |
419 | 419 | self = mmap(NULL, sizeof(*self), PROT_READ | PROT_WRITE, \ |
|
431 | 431 | /* Let setup failure terminate early. */ \ |
432 | 432 | if (_metadata->exit_code) \ |
433 | 433 | _exit(0); \ |
434 | | - _metadata->setup_completed = true; \ |
| 434 | + *_metadata->no_teardown = false; \ |
435 | 435 | fixture_name##_##test_name(_metadata, self, variant->data); \ |
436 | 436 | } else if (child < 0 || child != waitpid(child, &status, 0)) { \ |
437 | 437 | ksft_print_msg("ERROR SPAWNING TEST GRANDCHILD\n"); \ |
438 | 438 | _metadata->exit_code = KSFT_FAIL; \ |
439 | 439 | } \ |
440 | 440 | } \ |
441 | 441 | if (child == 0) { \ |
442 | | - if (_metadata->setup_completed && !fixture_name##_teardown_parent && \ |
443 | | - !__atomic_test_and_set(teardown, __ATOMIC_RELAXED)) \ |
| 442 | + if (!fixture_name##_teardown_parent && \ |
| 443 | + !__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \ |
444 | 444 | fixture_name##_teardown(_metadata, self, variant->data); \ |
445 | 445 | _exit(0); \ |
446 | 446 | } \ |
447 | | - if (_metadata->setup_completed && fixture_name##_teardown_parent && \ |
448 | | - !__atomic_test_and_set(teardown, __ATOMIC_RELAXED)) \ |
| 447 | + if (fixture_name##_teardown_parent && \ |
| 448 | + !__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \ |
449 | 449 | fixture_name##_teardown(_metadata, self, variant->data); \ |
450 | | - munmap(teardown, sizeof(*teardown)); \ |
| 450 | + munmap(_metadata->no_teardown, sizeof(*_metadata->no_teardown)); \ |
| 451 | + _metadata->no_teardown = NULL; \ |
451 | 452 | if (self && fixture_name##_teardown_parent) \ |
452 | 453 | munmap(self, sizeof(*self)); \ |
453 | 454 | if (WIFEXITED(status)) { \ |
@@ -916,7 +917,7 @@ struct __test_metadata { |
916 | 917 | int trigger; /* extra handler after the evaluation */ |
917 | 918 | int timeout; /* seconds to wait for test timeout */ |
918 | 919 | bool aborted; /* stopped test due to failed ASSERT */ |
919 | | - bool setup_completed; /* did setup finish? */ |
| 920 | + bool *no_teardown; /* fixture needs teardown */ |
920 | 921 | jmp_buf env; /* for exiting out of test early */ |
921 | 922 | struct __test_results *results; |
922 | 923 | struct __test_metadata *prev, *next; |
@@ -1195,7 +1196,7 @@ static void __run_test(struct __fixture_metadata *f, |
1195 | 1196 | t->exit_code = KSFT_PASS; |
1196 | 1197 | t->trigger = 0; |
1197 | 1198 | t->aborted = false; |
1198 | | - t->setup_completed = false; |
| 1199 | + t->no_teardown = NULL; |
1199 | 1200 | memset(t->env, 0, sizeof(t->env)); |
1200 | 1201 | memset(t->results->reason, 0, sizeof(t->results->reason)); |
1201 | 1202 |
|
|
0 commit comments