diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-03-07 14:36:22 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-03-14 08:46:49 +0100 |
commit | 53ad908a646eb6fd67f9b4586f4b484e8255b9d3 (patch) | |
tree | 7dd408879d01a507e6052f375ec6e14ab3f8965d /testsuites/sptests/spprofiling01 | |
parent | score: Add per-CPU profiling (diff) | |
download | rtems-53ad908a646eb6fd67f9b4586f4b484e8255b9d3.tar.bz2 |
score: Add SMP lock profiling support
Diffstat (limited to 'testsuites/sptests/spprofiling01')
-rw-r--r-- | testsuites/sptests/spprofiling01/init.c | 92 |
1 files changed, 90 insertions, 2 deletions
diff --git a/testsuites/sptests/spprofiling01/init.c b/testsuites/sptests/spprofiling01/init.c index a1af66bba2..a1f6cd7f3c 100644 --- a/testsuites/sptests/spprofiling01/init.c +++ b/testsuites/sptests/spprofiling01/init.c @@ -21,10 +21,97 @@ #include <rtems.h> #include <stdio.h> +#include <string.h> #include "tmacros.h" -static void test(void) +typedef struct { + rtems_interrupt_lock a; + rtems_interrupt_lock b; + rtems_interrupt_lock c; + rtems_interrupt_lock d; + enum { + WAIT_FOR_A, + EXPECT_B, + EXPECT_D, + DONE + } state; +} visitor_context; + +static bool is_equal(const rtems_profiling_smp_lock *psl, const char *name) +{ + return strcmp(psl->name, name) == 0; +} + +static void visitor(void *arg, const rtems_profiling_data *data) +{ + visitor_context *ctx = arg; + + if (data->header.type == RTEMS_PROFILING_SMP_LOCK) { + const rtems_profiling_smp_lock *psl = &data->smp_lock; + + switch (ctx->state) { + case WAIT_FOR_A: + rtems_test_assert(!is_equal(psl, "b")); + rtems_test_assert(!is_equal(psl, "c")); + rtems_test_assert(!is_equal(psl, "d")); + + if (is_equal(psl, "a")) { + ctx->state = EXPECT_B; + } + break; + case EXPECT_B: + rtems_test_assert(is_equal(psl, "b")); + rtems_interrupt_lock_destroy(&ctx->c); + ctx->state = EXPECT_D; + break; + case EXPECT_D: + rtems_test_assert(is_equal(psl, "d")); + ctx->state = DONE; + break; + case DONE: + rtems_test_assert(!is_equal(psl, "a")); + rtems_test_assert(!is_equal(psl, "b")); + rtems_test_assert(!is_equal(psl, "c")); + rtems_test_assert(!is_equal(psl, "d")); + break; + } + } +} + +static void lock_init(rtems_interrupt_lock *lock, const char *name) +{ + rtems_interrupt_lock_context lock_context; + + rtems_interrupt_lock_initialize(lock, name); + rtems_interrupt_lock_acquire(lock, &lock_context); + rtems_interrupt_lock_release(lock, &lock_context); +} + +static void test_iterate(void) +{ + visitor_context ctx_instance; + visitor_context *ctx = &ctx_instance; + + ctx->state = WAIT_FOR_A; + lock_init(&ctx->a, "a"); + lock_init(&ctx->b, "b"); + lock_init(&ctx->c, "c"); + lock_init(&ctx->d, "d"); + + rtems_profiling_iterate(visitor, ctx); + + rtems_interrupt_lock_destroy(&ctx->a); + rtems_interrupt_lock_destroy(&ctx->b); + + if (ctx->state != DONE) { + rtems_interrupt_lock_destroy(&ctx->c); + } + + rtems_interrupt_lock_destroy(&ctx->d); +} + +static void test_report_xml(void) { rtems_status_code sc; int rv; @@ -40,7 +127,8 @@ static void Init(rtems_task_argument arg) { puts("\n\n*** TEST SPPROFILING 1 ***"); - test(); + test_iterate(); + test_report_xml(); puts("*** END OF TEST SPPROFILING 1 ***"); |