diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-08-05 08:14:47 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-08-05 08:14:47 +0200 |
commit | d36b0fece77976f50c8cedb988377196494ba037 (patch) | |
tree | 7f8cc747944f0fac522a0fa32eeea5dafa57e925 | |
parent | b2e2d6451f0034f5c182784c5a257a2ed8264205 (diff) |
tx-support add thread queue wrap
-rw-r--r-- | spec/build/testsuites/validation/libvalidation.yml | 1 | ||||
-rw-r--r-- | testsuites/validation/tx-support.h | 21 | ||||
-rw-r--r-- | testsuites/validation/tx-wrap-thread-queue.c | 105 |
3 files changed, 127 insertions, 0 deletions
diff --git a/spec/build/testsuites/validation/libvalidation.yml b/spec/build/testsuites/validation/libvalidation.yml index 3631544972..e5e3fd462b 100644 --- a/spec/build/testsuites/validation/libvalidation.yml +++ b/spec/build/testsuites/validation/libvalidation.yml @@ -20,5 +20,6 @@ source: - testsuites/validation/tx-thread-queue.c - testsuites/validation/tx-timecounter.c - testsuites/validation/tx-timer-server.c +- testsuites/validation/tx-wrap-thread-queue.c target: validation type: build diff --git a/testsuites/validation/tx-support.h b/testsuites/validation/tx-support.h index f933f1b6d6..df0e6a1333 100644 --- a/testsuites/validation/tx-support.h +++ b/testsuites/validation/tx-support.h @@ -40,6 +40,7 @@ #include <rtems.h> #include <rtems/irq-extension.h> #include <rtems/score/atomic.h> +#include <rtems/score/threadq.h> #ifdef __cplusplus extern "C" { @@ -309,6 +310,26 @@ void CallWithinISRSubmit( CallWithinISRRequest *request ); void CallWithinISRWait( const CallWithinISRRequest *request ); +typedef struct { + Thread_queue_Operations tq_ops; + const Thread_queue_Operations *wrapped_ops; + Thread_queue_Control thread_queue; + CallWithinISRRequest isr_request; +} WrapThreadQueueContext; + +void WrapThreadQueueInitialize( + WrapThreadQueueContext *ctx, + void ( *handler )( void * ), + void *arg +); + +void WrapThreadQueueExtract( + WrapThreadQueueContext *ctx, + struct _Thread_Control *thread +); + +void WrapThreadQueueDestroy( WrapThreadQueueContext *ctx ); + rtems_vector_number GetValidInterruptVectorNumber( const rtems_interrupt_attributes *required ); diff --git a/testsuites/validation/tx-wrap-thread-queue.c b/testsuites/validation/tx-wrap-thread-queue.c new file mode 100644 index 0000000000..a652d399cc --- /dev/null +++ b/testsuites/validation/tx-wrap-thread-queue.c @@ -0,0 +1,105 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup RTEMSTestSuites + * + * @brief This source file contains the implementation of the thread queue + * wrapper. + */ + +/* + * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de) + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "tx-support.h" + +#include <rtems/score/threadimpl.h> +#include <rtems/score/threadqimpl.h> + +#include <string.h> + +static void Extract( + Thread_queue_Queue *queue, + Thread_Control *thread, + Thread_queue_Context *queue_context +) +{ + WrapThreadQueueContext *ctx; + + ctx = (WrapThreadQueueContext *) thread->Wait.operations; + CallWithinISRSubmit( &ctx->isr_request ); + + if ( ctx->wrapped_ops ) { + thread->Wait.operations = ctx->wrapped_ops; + ( *thread->Wait.operations->extract )( queue, thread, queue_context ); + } +} + +void WrapThreadQueueInitialize( + WrapThreadQueueContext *ctx, + void ( *handler )( void * ), + void *arg +) +{ + memset( ctx, 0, sizeof( *ctx ) ); + ctx->tq_ops.extract = Extract; + ctx->isr_request.handler = handler; + ctx->isr_request.arg = arg; + _Thread_queue_Initialize( &ctx->thread_queue, "Wrap" ); +} + +void WrapThreadQueueExtract( + WrapThreadQueueContext *ctx, + Thread_Control *thread +) +{ + if ( thread->Wait.queue != NULL ) { + ctx->wrapped_ops = thread->Wait.operations; + thread->Wait.operations = &ctx->tq_ops; + } else { + Thread_queue_Context queue_context; + + ctx->wrapped_ops = NULL; + _Thread_queue_Context_initialize( &queue_context ); + _Thread_queue_Acquire( &ctx->thread_queue, &queue_context ); + _Thread_Wait_flags_set( + thread, + THREAD_WAIT_CLASS_OBJECT | THREAD_WAIT_STATE_INTEND_TO_BLOCK + ); + _Thread_Wait_claim( thread, &ctx->thread_queue.Queue ); + _Thread_Wait_claim_finalize( thread, &ctx->tq_ops ); + _Thread_queue_Release( &ctx->thread_queue, &queue_context ); + } +} + +void WrapThreadQueueDestroy( WrapThreadQueueContext *ctx ) +{ + _Thread_queue_Destroy( &ctx->thread_queue ); +} |