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 | |
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')
-rw-r--r-- | cpukit/posix/include/rtems/posix/barrier.h | 64 | ||||
-rw-r--r-- | cpukit/posix/include/rtems/posix/barrierimpl.h | 87 | ||||
-rw-r--r-- | cpukit/posix/include/rtems/posix/config.h | 6 |
3 files changed, 51 insertions, 106 deletions
diff --git a/cpukit/posix/include/rtems/posix/barrier.h b/cpukit/posix/include/rtems/posix/barrier.h deleted file mode 100644 index e445586511..0000000000 --- a/cpukit/posix/include/rtems/posix/barrier.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @file - * - * @brief Constants and Structures Associated with the POSIX Barrier Manager - * - * This include file contains all the constants and structures associated - * with the POSIX Barrier Manager. - * - * Directives provided are: - * - * - create a barrier - * - delete a barrier - * - wait for a barrier - */ - -/* - * COPYRIGHT (c) 1989-2011. - * On-Line Applications Research Corporation (OAR). - * - * 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. - */ - -#ifndef _RTEMS_POSIX_BARRIER_H -#define _RTEMS_POSIX_BARRIER_H - -#include <rtems/score/object.h> -#include <rtems/score/corebarrier.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @defgroup POSIXBarrier POSIX Barriers - * - * @ingroup POSIXAPI - * - * This encapsulates functionality which implements the RTEMS API - * Barrier Manager. - * - */ -/**@{**/ - -/** - * This type defines the control block used to manage each barrier. - */ - -typedef struct { - /** This is used to manage a barrier as an object. */ - Objects_Control Object; - /** This is used to implement the barrier. */ - CORE_barrier_Control Barrier; -} POSIX_Barrier_Control; - -#ifdef __cplusplus -} -#endif - -/** @} */ - -#endif -/* end of include file */ 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 diff --git a/cpukit/posix/include/rtems/posix/config.h b/cpukit/posix/include/rtems/posix/config.h index 6c74216dc2..dc1ef0c2f1 100644 --- a/cpukit/posix/include/rtems/posix/config.h +++ b/cpukit/posix/include/rtems/posix/config.h @@ -100,12 +100,6 @@ typedef struct { /** * This field contains the maximum number of POSIX API - * barriers which are configured for this application. - */ - uint32_t maximum_barriers; - - /** - * This field contains the maximum number of POSIX API * read/write locks which are configured for this application. */ uint32_t maximum_rwlocks; |