Skip to content

Commit 5f036a2

Browse files
committed
selftests: harness: Add teardown callback to test metadata
To get rid of setjmp()/longjmp(), the teardown logic needs to be usable from __bail(). Introduce a new callback for it. Signed-off-by: Thomas Weißschuh <[email protected]> Acked-by: Shuah Khan <[email protected]> Link: https://lore.kernel.org/r/20250505-nolibc-kselftest-harness-v4-10-ee4dd5257135@linutronix.de Signed-off-by: Thomas Weißschuh <[email protected]>
1 parent 906dbc1 commit 5f036a2

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

tools/testing/selftests/kselftest_harness.h

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -439,14 +439,10 @@
439439
} \
440440
} \
441441
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); \
445443
_exit(0); \
446444
} \
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); \
450446
munmap(_metadata->no_teardown, sizeof(*_metadata->no_teardown)); \
451447
_metadata->no_teardown = NULL; \
452448
if (self && fixture_name##_teardown_parent) \
@@ -460,6 +456,14 @@
460456
} \
461457
__test_check_assert(_metadata); \
462458
} \
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+
} \
463467
static struct __test_metadata *_##fixture_name##_##test_name##_object; \
464468
static void __attribute__((constructor)) \
465469
_register_##fixture_name##_##test_name(void) \
@@ -469,6 +473,7 @@
469473
object->name = #test_name; \
470474
object->fn = &wrapper_##fixture_name##_##test_name; \
471475
object->fixture = &_##fixture_name##_fixture_object; \
476+
object->teardown_fn = &wrapper_##fixture_name##_##test_name##_teardown; \
472477
object->termsig = signal; \
473478
object->timeout = tmout; \
474479
_##fixture_name##_##test_name##_object = object; \
@@ -912,6 +917,8 @@ struct __test_metadata {
912917
struct __fixture_variant_metadata *);
913918
pid_t pid; /* pid of test when being run */
914919
struct __fixture_metadata *fixture;
920+
void (*teardown_fn)(bool in_parent, struct __test_metadata *_metadata,
921+
void *self, const void *variant);
915922
int termsig;
916923
int exit_code;
917924
int trigger; /* extra handler after the evaluation */

0 commit comments

Comments
 (0)