|
439 | 439 | } \ |
440 | 440 | } \ |
441 | 441 | if (child == 0) { \ |
442 | | - if (!fixture_name##_teardown_parent && \ |
443 | | - !__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \ |
444 | | - fixture_name##_teardown(_metadata, self, variant->data); \ |
| 442 | + _metadata->teardown_fn(false, _metadata, self, variant->data); \ |
445 | 443 | _exit(0); \ |
446 | 444 | } \ |
447 | | - if (fixture_name##_teardown_parent && \ |
448 | | - !__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \ |
449 | | - fixture_name##_teardown(_metadata, self, variant->data); \ |
| 445 | + _metadata->teardown_fn(true, _metadata, self, variant->data); \ |
450 | 446 | munmap(_metadata->no_teardown, sizeof(*_metadata->no_teardown)); \ |
451 | 447 | _metadata->no_teardown = NULL; \ |
452 | 448 | if (self && fixture_name##_teardown_parent) \ |
|
460 | 456 | } \ |
461 | 457 | __test_check_assert(_metadata); \ |
462 | 458 | } \ |
| 459 | + static void wrapper_##fixture_name##_##test_name##_teardown( \ |
| 460 | + bool in_parent, struct __test_metadata *_metadata, \ |
| 461 | + void *self, const void *variant) \ |
| 462 | + { \ |
| 463 | + if (fixture_name##_teardown_parent == in_parent && \ |
| 464 | + !__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \ |
| 465 | + fixture_name##_teardown(_metadata, self, variant); \ |
| 466 | + } \ |
463 | 467 | static struct __test_metadata *_##fixture_name##_##test_name##_object; \ |
464 | 468 | static void __attribute__((constructor)) \ |
465 | 469 | _register_##fixture_name##_##test_name(void) \ |
|
469 | 473 | object->name = #test_name; \ |
470 | 474 | object->fn = &wrapper_##fixture_name##_##test_name; \ |
471 | 475 | object->fixture = &_##fixture_name##_fixture_object; \ |
| 476 | + object->teardown_fn = &wrapper_##fixture_name##_##test_name##_teardown; \ |
472 | 477 | object->termsig = signal; \ |
473 | 478 | object->timeout = tmout; \ |
474 | 479 | _##fixture_name##_##test_name##_object = object; \ |
@@ -912,6 +917,8 @@ struct __test_metadata { |
912 | 917 | struct __fixture_variant_metadata *); |
913 | 918 | pid_t pid; /* pid of test when being run */ |
914 | 919 | struct __fixture_metadata *fixture; |
| 920 | + void (*teardown_fn)(bool in_parent, struct __test_metadata *_metadata, |
| 921 | + void *self, const void *variant); |
915 | 922 | int termsig; |
916 | 923 | int exit_code; |
917 | 924 | int trigger; /* extra handler after the evaluation */ |
|
0 commit comments