[PATCH 1/8] libtest: Make test case allocator configurable

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Nov 13 10:07:50 UTC 2020


---
 cpukit/Makefile.am                 |   1 -
 cpukit/include/rtems/test.h        |   2 +
 cpukit/libtest/t-test-malloc.c     | 112 -----------------------------
 cpukit/libtest/t-test.c            |  86 ++++++++++++++++++++++
 cpukit/libtest/testrun.c           |   4 ++
 spec/build/cpukit/librtemstest.yml |   1 -
 testsuites/libtests/ttest01/init.c |   3 +
 7 files changed, 95 insertions(+), 114 deletions(-)
 delete mode 100644 cpukit/libtest/t-test-malloc.c

diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am
index 4e370ae639..8c7f9c1ed4 100644
--- a/cpukit/Makefile.am
+++ b/cpukit/Makefile.am
@@ -1877,7 +1877,6 @@ librtemstest_a_SOURCES += libtest/t-test-checks-eno.c
 librtemstest_a_SOURCES += libtest/t-test-checks-psx.c
 librtemstest_a_SOURCES += libtest/t-test-hash-sha256.c
 librtemstest_a_SOURCES += libtest/t-test-interrupt.c
-librtemstest_a_SOURCES += libtest/t-test-malloc.c
 librtemstest_a_SOURCES += libtest/t-test-rtems.c
 librtemstest_a_SOURCES += libtest/t-test-rtems-context.c
 librtemstest_a_SOURCES += libtest/t-test-rtems-fds.c
diff --git a/cpukit/include/rtems/test.h b/cpukit/include/rtems/test.h
index 935e796bf0..7d8b131286 100644
--- a/cpukit/include/rtems/test.h
+++ b/cpukit/include/rtems/test.h
@@ -2286,6 +2286,8 @@ typedef struct {
 	void *putchar_arg;
 	T_verbosity verbosity;
 	T_time (*now)(void);
+	void *(*allocate)(size_t);
+	void (*deallocate)(void *);
 	size_t action_count;
 	const T_action *actions;
 } T_config;
diff --git a/cpukit/libtest/t-test-malloc.c b/cpukit/libtest/t-test-malloc.c
deleted file mode 100644
index 369bff9a57..0000000000
--- a/cpukit/libtest/t-test-malloc.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * SPDX-License-Identifier: BSD-2-Clause
- *
- * Copyright (C) 2018 embedded brains GmbH
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <rtems/test.h>
-
-#include <stdlib.h>
-
-#ifdef __BIGGEST_ALIGNMENT__
-#define T_BIGGEST_ALIGNMENT __BIGGEST_ALIGNMENT__
-#else
-#define T_BIGGEST_ALIGNMENT sizeof(long long)
-#endif
-
-typedef struct __attribute__((__aligned__(T_BIGGEST_ALIGNMENT))) {
-	T_destructor base;
-	void (*destroy)(void *);
-} T_malloc_destructor;
-
-static void
-T_malloc_destroy(T_destructor *base)
-{
-	T_malloc_destructor *dtor;
-
-	dtor = (T_malloc_destructor *)(uintptr_t)base;
-
-	if (dtor->destroy != NULL) {
-		(*dtor->destroy)(dtor + 1);
-	}
-
-	free(dtor);
-}
-
-static void *
-T_do_malloc(size_t size, void (*destroy)(void *))
-{
-	T_malloc_destructor *dtor;
-	size_t new_size;
-
-	new_size = sizeof(*dtor) + size;
-	if (new_size <= size) {
-		return NULL;
-	}
-
-	dtor = malloc(new_size);
-	if (dtor != NULL) {
-		dtor->destroy = destroy;
-		T_add_destructor(&dtor->base, T_malloc_destroy);
-		++dtor;
-	}
-
-	return dtor;
-}
-
-void *
-T_malloc(size_t size)
-{
-	return T_do_malloc(size, NULL);
-}
-
-void *
-T_calloc(size_t nelem, size_t elsize)
-{
-	return T_zalloc(nelem * elsize, NULL);
-}
-
-void *
-T_zalloc(size_t size, void (*destroy)(void *))
-{
-	void *p;
-
-	p = T_do_malloc(size, destroy);
-	if (p != NULL) {
-		p = memset(p, 0, size);
-	}
-
-	return p;
-}
-
-void
-T_free(void *ptr)
-{
-	T_malloc_destructor *dtor;
-
-	dtor = ptr;
-	--dtor;
-	T_remove_destructor(&dtor->base);
-	free(dtor);
-}
diff --git a/cpukit/libtest/t-test.c b/cpukit/libtest/t-test.c
index 11f1cf70e9..2e27e3c9e6 100644
--- a/cpukit/libtest/t-test.c
+++ b/cpukit/libtest/t-test.c
@@ -1299,3 +1299,89 @@ T_get_scope(const char * const * const *desc, char *buf, size_t n,
 
 	return n - c;
 }
+
+#ifdef __BIGGEST_ALIGNMENT__
+#define T_BIGGEST_ALIGNMENT __BIGGEST_ALIGNMENT__
+#else
+#define T_BIGGEST_ALIGNMENT sizeof(long long)
+#endif
+
+typedef struct __attribute__((__aligned__(T_BIGGEST_ALIGNMENT))) {
+	T_destructor base;
+	void (*destroy)(void *);
+} T_malloc_destructor;
+
+static void
+T_malloc_destroy(T_destructor *base)
+{
+	T_malloc_destructor *dtor;
+
+	dtor = (T_malloc_destructor *)(uintptr_t)base;
+
+	if (dtor->destroy != NULL) {
+		(*dtor->destroy)(dtor + 1);
+	}
+
+	(*T_instance.config->deallocate)(dtor);
+}
+
+static void *
+T_do_malloc(size_t size, void (*destroy)(void *))
+{
+	T_malloc_destructor *dtor;
+	size_t new_size;
+
+	new_size = sizeof(*dtor) + size;
+	if (new_size <= size) {
+		return NULL;
+	}
+
+	if (T_instance.config->allocate == NULL) {
+		return NULL;
+	}
+
+	dtor = (*T_instance.config->allocate)(new_size);
+	if (dtor != NULL) {
+		dtor->destroy = destroy;
+		T_add_destructor(&dtor->base, T_malloc_destroy);
+		++dtor;
+	}
+
+	return dtor;
+}
+
+void *
+T_malloc(size_t size)
+{
+	return T_do_malloc(size, NULL);
+}
+
+void *
+T_calloc(size_t nelem, size_t elsize)
+{
+	return T_zalloc(nelem * elsize, NULL);
+}
+
+void *
+T_zalloc(size_t size, void (*destroy)(void *))
+{
+	void *p;
+
+	p = T_do_malloc(size, destroy);
+	if (p != NULL) {
+		p = memset(p, 0, size);
+	}
+
+	return p;
+}
+
+void
+T_free(void *ptr)
+{
+	T_malloc_destructor *dtor;
+
+	dtor = ptr;
+	--dtor;
+	T_remove_destructor(&dtor->base);
+	(*T_instance.config->deallocate)(dtor);
+}
diff --git a/cpukit/libtest/testrun.c b/cpukit/libtest/testrun.c
index d11bf63c17..59418e8c7d 100644
--- a/cpukit/libtest/testrun.c
+++ b/cpukit/libtest/testrun.c
@@ -40,6 +40,8 @@
 #include <rtems/test-info.h>
 #include <rtems/test.h>
 
+#include <stdlib.h>
+
 static char buffer[ 512 ];
 
 static const T_action actions[] = {
@@ -65,6 +67,8 @@ static const T_config config = {
   .putchar = T_putchar_default,
   .verbosity = T_VERBOSE,
   .now = T_now_clock,
+  .allocate = malloc,
+  .deallocate = free,
   .action_count = T_ARRAY_SIZE( actions ),
   .actions = actions
 };
diff --git a/spec/build/cpukit/librtemstest.yml b/spec/build/cpukit/librtemstest.yml
index 920ee7250c..ee116fba49 100644
--- a/spec/build/cpukit/librtemstest.yml
+++ b/spec/build/cpukit/librtemstest.yml
@@ -25,7 +25,6 @@ source:
 - cpukit/libtest/t-test-checks-psx.c
 - cpukit/libtest/t-test-hash-sha256.c
 - cpukit/libtest/t-test-interrupt.c
-- cpukit/libtest/t-test-malloc.c
 - cpukit/libtest/t-test-rtems.c
 - cpukit/libtest/t-test-rtems-context.c
 - cpukit/libtest/t-test-rtems-fds.c
diff --git a/testsuites/libtests/ttest01/init.c b/testsuites/libtests/ttest01/init.c
index c0ccee9aa4..f5405208a0 100644
--- a/testsuites/libtests/ttest01/init.c
+++ b/testsuites/libtests/ttest01/init.c
@@ -28,6 +28,7 @@
 #include <rtems/test.h>
 
 #include <sys/time.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include <rtems.h>
@@ -255,6 +256,8 @@ static const T_config config = {
 	.putchar_arg = &test_instance,
 	.verbosity = T_VERBOSE,
 	.now = now,
+	.allocate = malloc,
+	.deallocate = free,
 	.action_count = T_ARRAY_SIZE(actions),
 	.actions = actions
 };
-- 
2.26.2



More information about the devel mailing list