forked from Imagelibrary/rtems
libtest: Make test case allocator configurable
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user