From e67929c4c0025ef46053523be4c8736dd178cbec Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 21 Sep 2017 14:13:16 +0200 Subject: 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. --- cpukit/posix/include/rtems/posix/barrier.h | 64 ------------------- cpukit/posix/include/rtems/posix/barrierimpl.h | 87 +++++++++++++++----------- cpukit/posix/include/rtems/posix/config.h | 6 -- 3 files changed, 51 insertions(+), 106 deletions(-) delete mode 100644 cpukit/posix/include/rtems/posix/barrier.h (limited to 'cpukit/posix/include/rtems/posix') 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 -#include - -#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 -#include -#include - #include #include +#include +#include + #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 @@ -98,12 +98,6 @@ typedef struct { */ uint32_t maximum_semaphores; - /** - * 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. -- cgit v1.2.3