[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