diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-09-21 14:13:16 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-10-05 14:29:01 +0200 |
commit | e67929c4c0025ef46053523be4c8736dd178cbec (patch) | |
tree | 09fca2c6ff8369031b9e76d97872da12236e155a /cpukit/posix/include/rtems/posix/barrierimpl.h | |
parent | posix: Implement self-contained POSIX semaphores (diff) | |
download | rtems-e67929c4c0025ef46053523be4c8736dd178cbec.tar.bz2 |
posix: Implement self-contained POSIX barriers
POSIX barriers are now available in all configurations and no longer
depend on --enable-posix.
Update #2514.
Update #3114.
Diffstat (limited to 'cpukit/posix/include/rtems/posix/barrierimpl.h')
-rw-r--r-- | cpukit/posix/include/rtems/posix/barrierimpl.h | 87 |
1 files changed, 51 insertions, 36 deletions
diff --git a/cpukit/posix/include/rtems/posix/barrierimpl.h b/cpukit/posix/include/rtems/posix/barrierimpl.h index fae66a6171..a1794b82fd 100644 --- a/cpukit/posix/include/rtems/posix/barrierimpl.h +++ b/cpukit/posix/include/rtems/posix/barrierimpl.h @@ -11,6 +11,8 @@ * COPYRIGHT (c) 1989-2011. * On-Line Applications Research Corporation (OAR). * + * Copyright (c) 2017 embedded brains GmbH + * * 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. @@ -19,63 +21,76 @@ #ifndef _RTEMS_POSIX_BARRIERIMPL_H #define _RTEMS_POSIX_BARRIERIMPL_H -#include <rtems/posix/barrier.h> -#include <rtems/score/corebarrierimpl.h> -#include <rtems/score/objectimpl.h> - #include <errno.h> #include <pthread.h> +#include <rtems/score/percpu.h> +#include <rtems/score/threadqimpl.h> + #ifdef __cplusplus extern "C" { #endif -/** - * The following defines the information control block used to manage - * this class of objects. - */ +#define POSIX_BARRIER_MAGIC 0x1cf03773UL -extern Objects_Information _POSIX_Barrier_Information; +#define POSIX_BARRIER_TQ_OPERATIONS &_Thread_queue_Operations_FIFO -/** - * @brief Allocate a barrier control block. - * - * This function allocates a barrier control block from - * the inactive chain of free barrier control blocks. - */ -RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Allocate( void ) +typedef struct { + unsigned long flags; + Thread_queue_Syslock_queue Queue; + unsigned int count; + unsigned int waiting_threads; +} POSIX_Barrier_Control; + +static inline POSIX_Barrier_Control *_POSIX_Barrier_Get( + pthread_barrier_t *_barrier +) { - return (POSIX_Barrier_Control *) - _Objects_Allocate( &_POSIX_Barrier_Information ); + return (POSIX_Barrier_Control *) _barrier; } -/** - * @brief Free a barrier control block. - * - * This routine frees a barrier control block to the - * inactive chain of free barrier control blocks. - */ -RTEMS_INLINE_ROUTINE void _POSIX_Barrier_Free ( - POSIX_Barrier_Control *the_barrier +static inline Thread_Control *_POSIX_Barrier_Queue_acquire( + POSIX_Barrier_Control *barrier, + Thread_queue_Context *queue_context ) { - _CORE_barrier_Destroy( &the_barrier->Barrier ); - _Objects_Free( &_POSIX_Barrier_Information, &the_barrier->Object ); + ISR_Level level; + Thread_Control *executing; + + _Thread_queue_Context_initialize( queue_context ); + _Thread_queue_Context_ISR_disable( queue_context, level ); + _Thread_queue_Context_set_ISR_level( queue_context, level ); + executing = _Thread_Executing; + _Thread_queue_Queue_acquire_critical( + &barrier->Queue.Queue, + &executing->Potpourri_stats, + &queue_context->Lock_context.Lock_context + ); + + return executing; } -RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Get( - const pthread_barrier_t *barrier, - Thread_queue_Context *queue_context +static inline void _POSIX_Barrier_Queue_release( + POSIX_Barrier_Control *barrier, + Thread_queue_Context *queue_context ) { - _Thread_queue_Context_initialize( queue_context ); - return (POSIX_Barrier_Control *) _Objects_Get( - (Objects_Id) *barrier, - &queue_context->Lock_context.Lock_context, - &_POSIX_Barrier_Information + _Thread_queue_Queue_release( + &barrier->Queue.Queue, + &queue_context->Lock_context.Lock_context ); } +#define POSIX_BARRIER_VALIDATE_OBJECT( bar ) \ + do { \ + if ( \ + ( bar ) == NULL \ + || ( (uintptr_t) ( bar ) ^ POSIX_BARRIER_MAGIC ) != ( bar )->_flags \ + ) { \ + return EINVAL; \ + } \ + } while ( 0 ) + #ifdef __cplusplus } #endif |