diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-01-14 09:08:18 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-03-26 11:29:58 +0100 |
commit | 6fe01e4b3d52b47c916bc4989e042255ff38e2ca (patch) | |
tree | 42b8d48366aeccc1bf26aa96311191947b13bcf3 /cpukit/libmisc | |
parent | score: Add ARM CPU architecture group (diff) | |
download | rtems-6fe01e4b3d52b47c916bc4989e042255ff38e2ca.tar.bz2 |
build: Move test support to librtemstest.a
One reason to move the test support into a dedicated library are the
standard output __wrap_*() functions. They may conflict with
application level wrappers.
Update #3199.
Diffstat (limited to 'cpukit/libmisc')
-rw-r--r-- | cpukit/libmisc/testsupport/testbeginend.c | 104 | ||||
-rw-r--r-- | cpukit/libmisc/testsupport/testbusy.c | 124 | ||||
-rw-r--r-- | cpukit/libmisc/testsupport/testextension.c | 74 | ||||
-rw-r--r-- | cpukit/libmisc/testsupport/testparallel.c | 196 | ||||
-rw-r--r-- | cpukit/libmisc/testsupport/testwrappers.c | 48 |
5 files changed, 0 insertions, 546 deletions
diff --git a/cpukit/libmisc/testsupport/testbeginend.c b/cpukit/libmisc/testsupport/testbeginend.c deleted file mode 100644 index b739e47b2e..0000000000 --- a/cpukit/libmisc/testsupport/testbeginend.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 2014, 2018 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * Copyright (c) 2017 Chris Johns <chrisj@rtems.org>. All rights reserved. - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif - -#include <rtems/test.h> -#include <rtems/bspIo.h> -#include <rtems/version.h> - -rtems_printer rtems_test_printer = { - .printer = rtems_printk_printer -}; - -static const char* const test_state_strings[] = -{ - "EXPECTED-PASS", - "EXPECTED-FAIL", - "USER_INPUT", - "INDETERMINATE", - "BENCHMARK" -}; - -int rtems_test_begin(const char* name, const RTEMS_TEST_STATE state) -{ - return rtems_printf( - &rtems_test_printer, - "\n\n*** BEGIN OF TEST %s ***\n" - "*** TEST VERSION: %s\n" - "*** TEST STATE: %s\n" - "*** TEST BUILD:" -#if RTEMS_DEBUG - " RTEMS_DEBUG" -#endif -#if RTEMS_MULTIPROCESSING - " RTEMS_MULTIPROCESSING" -#endif -#if RTEMS_NETWORKING - " RTEMS_NETWORKING" -#endif -#if RTEMS_PARAVIRT - " RTEMS_PARAVIRT" -#endif -#if RTEMS_POSIX_API - " RTEMS_POSIX_API" -#endif -#if RTEMS_PROFILING - " RTEMS_PROFILING" -#endif -#if RTEMS_SMP - " RTEMS_SMP" -#endif - "\n" - "*** TEST TOOLS: " __VERSION__ "\n", - name, - rtems_version(), - test_state_strings[state] - ); -} - -int rtems_test_end(const char* name) -{ - return rtems_printf( - &rtems_test_printer, - "\n*** END OF TEST %s ***\n\n", name - ); -} - -void rtems_test_exit(int status) -{ - (void) status; - rtems_shutdown_executive(0); -} - -int rtems_test_printf( - const char* format, - ... -) -{ - va_list ap; - int len; - va_start(ap, format); - len = rtems_vprintf( - &rtems_test_printer, - format, - ap - ); - va_end(ap); - return len; -} diff --git a/cpukit/libmisc/testsupport/testbusy.c b/cpukit/libmisc/testsupport/testbusy.c deleted file mode 100644 index 4cc8aa01fe..0000000000 --- a/cpukit/libmisc/testsupport/testbusy.c +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2014, 2018 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <rtems/test.h> -#include <rtems.h> -#include <rtems/score/threadimpl.h> - -static uint_fast32_t estimate_busy_loop_maximum( void ) -{ - uint_fast32_t units = 0; - uint_fast32_t initial = rtems_clock_get_ticks_since_boot(); - - while ( initial == rtems_clock_get_ticks_since_boot() ) { - ++units; - } - - return units; -} - -static uint_fast32_t wait_for_tick_change( void ) -{ - uint_fast32_t initial = rtems_clock_get_ticks_since_boot(); - uint_fast32_t now; - - do { - now = rtems_clock_get_ticks_since_boot(); - } while ( now == initial ); - - return now; -} - -/* - * It is important that we use actually use the same rtems_test_busy() function - * at the various places, since otherwise the obtained maximum value might be - * wrong. So, the compiler must not inline this function. - */ -RTEMS_NO_INLINE void rtems_test_busy( uint_fast32_t count ) -{ - uint_fast32_t i = 0; - - do { - __asm__ volatile (""); - ++i; - } while ( i < count ); -} - -uint_fast32_t rtems_test_get_one_tick_busy_count( void ) -{ - uint_fast32_t last; - uint_fast32_t now; - uint_fast32_t a; - uint_fast32_t b; - uint_fast32_t m; - - /* Choose a lower bound */ - a = 1; - - /* Estimate an upper bound */ - - wait_for_tick_change(); - b = 2 * estimate_busy_loop_maximum(); - - while ( true ) { - last = wait_for_tick_change(); - rtems_test_busy( b ); - now = rtems_clock_get_ticks_since_boot(); - - if ( now != last ) { - break; - } - - b *= 2; - last = now; - } - - /* Find a good value */ - do { - m = ( a + b ) / 2; - - last = wait_for_tick_change(); - rtems_test_busy( m ); - now = rtems_clock_get_ticks_since_boot(); - - if ( now != last ) { - b = m; - } else { - a = m; - } - } while ( b - a > 1 ); - - return m; -} - -void rtems_test_busy_cpu_usage( time_t seconds, long nanoseconds ) -{ - Thread_Control *executing; - Timestamp_Control busy; - Timestamp_Control start; - Timestamp_Control now; - - executing = _Thread_Get_executing(); - _Thread_Get_CPU_time_used( executing, &start ); - _Timestamp_Set( &busy, seconds, nanoseconds ); - - do { - _Thread_Get_CPU_time_used( executing, &now ); - } while ( now - start < busy ); -} diff --git a/cpukit/libmisc/testsupport/testextension.c b/cpukit/libmisc/testsupport/testextension.c deleted file mode 100644 index be4759742e..0000000000 --- a/cpukit/libmisc/testsupport/testextension.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2014 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif - -#include <rtems/test.h> -#include <rtems/profiling.h> -#include <rtems/bspIo.h> - -#if defined(RTEMS_PROFILING) -static bool report_done; - -RTEMS_INTERRUPT_LOCK_DEFINE( static, report_lock, "test report" ) -#endif - -void rtems_test_fatal_extension( - rtems_fatal_source source, - bool always_set_to_false, - rtems_fatal_code code -) -{ -#if defined(RTEMS_PROFILING) - rtems_interrupt_lock_context lock_context; - rtems_printer printer; - - rtems_print_printer_printk( &printer ); - - /* - * Ensures to report only once on SMP machines and ensures that the report is - * output completely. - */ - rtems_interrupt_lock_acquire( &report_lock, &lock_context ); - - if ( !report_done ) { - report_done = true; - - printk( - "\n*** PROFILING REPORT BEGIN %s ***\n", - rtems_test_name - ); - - rtems_profiling_report_xml( - rtems_test_name, - &printer, - 1, - " " - ); - - printk( - "*** PROFILING REPORT END %s ***\n", - rtems_test_name - ); - } - - rtems_interrupt_lock_release( &report_lock, &lock_context ); -#endif - - (void) source; - (void) always_set_to_false; - (void) code; -} diff --git a/cpukit/libmisc/testsupport/testparallel.c b/cpukit/libmisc/testsupport/testparallel.c deleted file mode 100644 index 1182242a7b..0000000000 --- a/cpukit/libmisc/testsupport/testparallel.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (c) 2013, 2016 embedded brains GmbH. All rights reserved. - * - * embedded brains GmbH - * Dornierstr. 4 - * 82178 Puchheim - * Germany - * <rtems@embedded-brains.de> - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - - -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif - -#include <rtems/test.h> -#include <rtems/score/assert.h> -#include <rtems.h> - -static void stop_worker_timer(rtems_id timer_id, void *arg) -{ - rtems_test_parallel_context *ctx = arg; - - _Atomic_Store_ulong(&ctx->stop, 1, ATOMIC_ORDER_RELAXED); -} - -static void start_worker_stop_timer( - rtems_test_parallel_context *ctx, - rtems_interval duration -) -{ - rtems_status_code sc; - - _Atomic_Store_ulong(&ctx->stop, 0, ATOMIC_ORDER_RELEASE); - - sc = rtems_timer_fire_after( - ctx->stop_worker_timer_id, - duration, - stop_worker_timer, - ctx - ); - _Assert(sc == RTEMS_SUCCESSFUL); - (void) sc; -} - -static void run_tests( - rtems_test_parallel_context *ctx, - const rtems_test_parallel_job *jobs, - size_t job_count -) -{ - SMP_barrier_State bs = SMP_BARRIER_STATE_INITIALIZER; - size_t i; - - _SMP_barrier_Wait(&ctx->barrier, &bs, ctx->worker_count); - - for (i = 0; i < job_count; ++i) { - const rtems_test_parallel_job *job = &jobs[i]; - size_t n = rtems_get_processor_count(); - size_t j = job->cascade ? 0 : rtems_get_processor_count() - 1; - - while (j < n) { - size_t active_worker = j + 1; - size_t worker_index; - rtems_interrupt_level level; - - /* - * Determine worker index via the current processor index to get - * consistent job runs with respect to the cache topology. - */ - rtems_interrupt_local_disable(level); - _SMP_barrier_Wait(&ctx->barrier, &bs, ctx->worker_count); - worker_index = rtems_get_current_processor(); - rtems_interrupt_local_enable(level); - - _Assert(worker_index < ctx->worker_count); - - if (rtems_test_parallel_is_master_worker(worker_index)) { - rtems_interval duration = (*job->init)(ctx, job->arg, active_worker); - - if (duration > 0) { - start_worker_stop_timer(ctx, duration); - } - } - - _SMP_barrier_Wait(&ctx->barrier, &bs, ctx->worker_count); - - if (worker_index <= j) { - (*job->body)(ctx, job->arg, active_worker, worker_index); - } - - _SMP_barrier_Wait(&ctx->barrier, &bs, ctx->worker_count); - - if (rtems_test_parallel_is_master_worker(worker_index)) { - (*job->fini)(ctx, job->arg, active_worker); - } - - _SMP_barrier_Wait(&ctx->barrier, &bs, ctx->worker_count); - - ++j; - } - } -} - -static void worker_task(rtems_task_argument arg) -{ - rtems_test_parallel_context *ctx = (rtems_test_parallel_context *) arg; - rtems_status_code sc; - - (void) sc; - - run_tests(ctx, ctx->jobs, ctx->job_count); - - while (true) { - /* Wait for delete by master worker */ - } -} - -void rtems_test_parallel( - rtems_test_parallel_context *ctx, - rtems_test_parallel_worker_setup worker_setup, - const rtems_test_parallel_job *jobs, - size_t job_count -) -{ - rtems_status_code sc; - size_t worker_index; - rtems_task_priority worker_priority; - - _Atomic_Init_ulong(&ctx->stop, 0); - _SMP_barrier_Control_initialize(&ctx->barrier); - ctx->worker_count = rtems_get_processor_count(); - ctx->worker_ids[0] = rtems_task_self(); - ctx->jobs = jobs; - ctx->job_count = job_count; - - if (RTEMS_ARRAY_SIZE(ctx->worker_ids) < ctx->worker_count) { - rtems_fatal_error_occurred(0xdeadbeef); - } - - sc = rtems_task_set_priority( - RTEMS_SELF, - RTEMS_CURRENT_PRIORITY, - &worker_priority - ); - if (sc != RTEMS_SUCCESSFUL) { - rtems_fatal_error_occurred(0xdeadbeef); - } - - sc = rtems_timer_create( - rtems_build_name('S', 'T', 'O', 'P'), - &ctx->stop_worker_timer_id - ); - if (sc != RTEMS_SUCCESSFUL) { - rtems_fatal_error_occurred(0xdeadbeef); - } - - for (worker_index = 1; worker_index < ctx->worker_count; ++worker_index) { - rtems_id worker_id; - - sc = rtems_task_create( - rtems_build_name('W', 'O', 'R', 'K'), - worker_priority, - RTEMS_MINIMUM_STACK_SIZE, - RTEMS_DEFAULT_MODES, - RTEMS_DEFAULT_ATTRIBUTES, - &worker_id - ); - if (sc != RTEMS_SUCCESSFUL) { - rtems_fatal_error_occurred(0xdeadbeef); - } - - ctx->worker_ids[worker_index] = worker_id; - - if (worker_setup != NULL) { - (*worker_setup)(ctx, worker_index, worker_id); - } - - sc = rtems_task_start(worker_id, worker_task, (rtems_task_argument) ctx); - _Assert(sc == RTEMS_SUCCESSFUL); - } - - run_tests(ctx, jobs, job_count); - - for (worker_index = 1; worker_index < ctx->worker_count; ++worker_index) { - sc = rtems_task_delete(ctx->worker_ids[worker_index]); - _Assert(sc == RTEMS_SUCCESSFUL); - } - - sc = rtems_timer_delete(ctx->stop_worker_timer_id); - _Assert(sc == RTEMS_SUCCESSFUL); -} diff --git a/cpukit/libmisc/testsupport/testwrappers.c b/cpukit/libmisc/testsupport/testwrappers.c deleted file mode 100644 index c86c4cc3f8..0000000000 --- a/cpukit/libmisc/testsupport/testwrappers.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2017 Chris Johns <chrisj@rtems.org>. All rights reserved. - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif - -#include <rtems/test.h> - -int __wrap_printf(const char* format, ...); -int __wrap_puts(const char *str); -int __wrap_putchar(int c); - -int __wrap_printf( - const char* format, - ... -) -{ - va_list ap; - int len; - va_start(ap, format); - len = rtems_vprintf( - &rtems_test_printer, - format, - ap - ); - va_end(ap); - return len; -} - -int __wrap_puts( - const char *str -) -{ - return rtems_test_printf( "%s\n", str ); -} - -int __wrap_putchar( - int c -) -{ - return rtems_test_printf( "%c", c ); -} |