|
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