Commit 5f036a2a authored by Thomas Weißschuh's avatar Thomas Weißschuh Committed by Thomas Weißschuh
Browse files

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: default avatarThomas Weißschuh <thomas.weissschuh@linutronix.de>
Acked-by: default avatarShuah Khan <skhan@linuxfoundation.org>
Link: https://lore.kernel.org/r/20250505-nolibc-kselftest-harness-v4-10-ee4dd5257135@linutronix.de


Signed-off-by: default avatarThomas Weißschuh <linux@weissschuh.net>
parent 906dbc17
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -439,14 +439,10 @@
			} \
		} \
		if (child == 0) { \
			if (!fixture_name##_teardown_parent && \
					!__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \
				fixture_name##_teardown(_metadata, self, variant->data); \
			_metadata->teardown_fn(false, _metadata, self, variant->data); \
			_exit(0); \
		} \
		if (fixture_name##_teardown_parent && \
				!__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \
			fixture_name##_teardown(_metadata, self, variant->data); \
		_metadata->teardown_fn(true, _metadata, self, variant->data); \
		munmap(_metadata->no_teardown, sizeof(*_metadata->no_teardown)); \
		_metadata->no_teardown = NULL; \
		if (self && fixture_name##_teardown_parent) \
@@ -460,6 +456,14 @@
		} \
		__test_check_assert(_metadata); \
	} \
	static void wrapper_##fixture_name##_##test_name##_teardown( \
		bool in_parent, struct __test_metadata *_metadata, \
		void *self, const void *variant) \
	{ \
		if (fixture_name##_teardown_parent == in_parent && \
				!__atomic_test_and_set(_metadata->no_teardown, __ATOMIC_RELAXED)) \
			fixture_name##_teardown(_metadata, self, variant); \
	} \
	static struct __test_metadata *_##fixture_name##_##test_name##_object; \
	static void __attribute__((constructor)) \
			_register_##fixture_name##_##test_name(void) \
@@ -469,6 +473,7 @@
		object->name = #test_name; \
		object->fn = &wrapper_##fixture_name##_##test_name; \
		object->fixture = &_##fixture_name##_fixture_object; \
		object->teardown_fn = &wrapper_##fixture_name##_##test_name##_teardown; \
		object->termsig = signal; \
		object->timeout = tmout; \
		_##fixture_name##_##test_name##_object = object; \
@@ -912,6 +917,8 @@ struct __test_metadata {
		   struct __fixture_variant_metadata *);
	pid_t pid;	/* pid of test when being run */
	struct __fixture_metadata *fixture;
	void (*teardown_fn)(bool in_parent, struct __test_metadata *_metadata,
			    void *self, const void *variant);
	int termsig;
	int exit_code;
	int trigger; /* extra handler after the evaluation */