|
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