From 89fc9345dea5c675f8d93546fa3c723918d3279a Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 21 Sep 2017 15:42:45 +0200 Subject: posix: Implement self-contained POSIX rwlocks POSIX rwlocks are now available in all configurations and no longer depend on --enable-posix. Update #2514. Update #3115. --- cpukit/score/include/rtems/score/corerwlock.h | 77 ----------------------- cpukit/score/include/rtems/score/corerwlockimpl.h | 68 ++++++++++++++++---- cpukit/score/include/rtems/score/objectimpl.h | 1 - cpukit/score/include/rtems/sysinit.h | 1 - 4 files changed, 56 insertions(+), 91 deletions(-) delete mode 100644 cpukit/score/include/rtems/score/corerwlock.h (limited to 'cpukit/score/include/rtems') diff --git a/cpukit/score/include/rtems/score/corerwlock.h b/cpukit/score/include/rtems/score/corerwlock.h deleted file mode 100644 index 89c18c6c65..0000000000 --- a/cpukit/score/include/rtems/score/corerwlock.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @file rtems/score/corerwlock.h - * - * @brief Constants and Structures Associated with the RWLock Handler - * - * This include file contains all the constants and structures associated - * with the RWLock Handler. - */ - -/* - * COPYRIGHT (c) 1989-2008. - * 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_SCORE_CORERWLOCK_H -#define _RTEMS_SCORE_CORERWLOCK_H - -#include - -/** - * @defgroup ScoreRWLock RWLock Handler - * - * @ingroup Score - * - * This handler encapsulates functionality which provides the foundation - * RWLock services used in all of the APIs supported by RTEMS. - */ -/**@{*/ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * RWLock State. - */ -typedef enum { - /** This indicates the the RWLock is not currently locked. - */ - CORE_RWLOCK_UNLOCKED, - /** This indicates the the RWLock is currently locked for reading. - */ - CORE_RWLOCK_LOCKED_FOR_READING, - /** This indicates the the RWLock is currently locked for reading. - */ - CORE_RWLOCK_LOCKED_FOR_WRITING -} CORE_RWLock_States; - -/** - * The following defines the control block used to manage each - * RWLock. - */ -typedef struct { - /** This field is the Waiting Queue used to manage the set of tasks - * which are blocked waiting for the RWLock to be released. - */ - Thread_queue_Control Wait_queue; - /** This element is the current state of the RWLock. - */ - CORE_RWLock_States current_state; - /** This element contains the current number of thread waiting for this - * RWLock to be released. */ - uint32_t number_of_readers; -} CORE_RWLock_Control; - -/**@}*/ - -#ifdef __cplusplus -} -#endif - -#endif -/* end of include file */ diff --git a/cpukit/score/include/rtems/score/corerwlockimpl.h b/cpukit/score/include/rtems/score/corerwlockimpl.h index 330d9acc55..942e8c8d75 100644 --- a/cpukit/score/include/rtems/score/corerwlockimpl.h +++ b/cpukit/score/include/rtems/score/corerwlockimpl.h @@ -19,10 +19,10 @@ #ifndef _RTEMS_SCORE_CORERWLOCKIMPL_H #define _RTEMS_SCORE_CORERWLOCKIMPL_H -#include +#include +#include #include #include -#include #include #ifdef __cplusplus @@ -48,6 +48,40 @@ extern "C" { */ #define CORE_RWLOCK_THREAD_WAITING_FOR_WRITE 1 +/** + * RWLock State. + */ +typedef enum { + /** This indicates the the RWLock is not currently locked. + */ + CORE_RWLOCK_UNLOCKED, + /** This indicates the the RWLock is currently locked for reading. + */ + CORE_RWLOCK_LOCKED_FOR_READING, + /** This indicates the the RWLock is currently locked for reading. + */ + CORE_RWLOCK_LOCKED_FOR_WRITING +} CORE_RWLock_States; + +/** + * The following defines the control block used to manage each + * RWLock. + */ +typedef struct { + /** This field is the Waiting Queue used to manage the set of tasks + * which are blocked waiting for the RWLock to be released. + */ + Thread_queue_Syslock_queue Queue; + + /** This element is the current state of the RWLock. + */ + CORE_RWLock_States current_state; + + /** This element contains the current number of thread waiting for this + * RWLock to be released. */ + unsigned int number_of_readers; +} CORE_RWLock_Control; + /** * @brief Initialize a RWlock. * @@ -63,15 +97,27 @@ RTEMS_INLINE_ROUTINE void _CORE_RWLock_Destroy( CORE_RWLock_Control *the_rwlock ) { - _Thread_queue_Destroy( &the_rwlock->Wait_queue ); + (void) the_rwlock; } -RTEMS_INLINE_ROUTINE void _CORE_RWLock_Acquire_critical( +RTEMS_INLINE_ROUTINE Thread_Control *_CORE_RWLock_Acquire( CORE_RWLock_Control *the_rwlock, Thread_queue_Context *queue_context ) { - _Thread_queue_Acquire_critical( &the_rwlock->Wait_queue, queue_context ); + ISR_Level level; + Thread_Control *executing; + + _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( + &the_rwlock->Queue.Queue, + &executing->Potpourri_stats, + &queue_context->Lock_context.Lock_context + ); + + return executing; } RTEMS_INLINE_ROUTINE void _CORE_RWLock_Release( @@ -79,7 +125,10 @@ RTEMS_INLINE_ROUTINE void _CORE_RWLock_Release( Thread_queue_Context *queue_context ) { - _Thread_queue_Release( &the_rwlock->Wait_queue, queue_context ); + _Thread_queue_Queue_release( + &the_rwlock->Queue.Queue, + &queue_context->Lock_context.Lock_context + ); } /** @@ -93,7 +142,6 @@ RTEMS_INLINE_ROUTINE void _CORE_RWLock_Release( Status_Control _CORE_RWLock_Seize_for_reading( CORE_RWLock_Control *the_rwlock, - Thread_Control *executing, bool wait, Thread_queue_Context *queue_context ); @@ -108,7 +156,6 @@ Status_Control _CORE_RWLock_Seize_for_reading( */ Status_Control _CORE_RWLock_Seize_for_writing( CORE_RWLock_Control *the_rwlock, - Thread_Control *executing, bool wait, Thread_queue_Context *queue_context ); @@ -123,10 +170,7 @@ Status_Control _CORE_RWLock_Seize_for_writing( * * @retval Status is returned to indicate successful or failure. */ -Status_Control _CORE_RWLock_Surrender( - CORE_RWLock_Control *the_rwlock, - Thread_queue_Context *queue_context -); +Status_Control _CORE_RWLock_Surrender( CORE_RWLock_Control *the_rwlock ); /** @} */ diff --git a/cpukit/score/include/rtems/score/objectimpl.h b/cpukit/score/include/rtems/score/objectimpl.h index e68035d338..f8e7ddd284 100644 --- a/cpukit/score/include/rtems/score/objectimpl.h +++ b/cpukit/score/include/rtems/score/objectimpl.h @@ -91,7 +91,6 @@ typedef enum { OBJECTS_POSIX_SEMAPHORES = 7, OBJECTS_POSIX_CONDITION_VARIABLES = 8, OBJECTS_POSIX_TIMERS = 9, - OBJECTS_POSIX_RWLOCKS = 11, OBJECTS_POSIX_SHMS = 12 } Objects_POSIX_API; diff --git a/cpukit/score/include/rtems/sysinit.h b/cpukit/score/include/rtems/sysinit.h index 29ad24dc2f..09b82e6836 100644 --- a/cpukit/score/include/rtems/sysinit.h +++ b/cpukit/score/include/rtems/sysinit.h @@ -52,7 +52,6 @@ extern "C" { #define RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE 000364 #define RTEMS_SYSINIT_POSIX_SEMAPHORE 000365 #define RTEMS_SYSINIT_POSIX_TIMER 000366 -#define RTEMS_SYSINIT_POSIX_RWLOCK 000368 #define RTEMS_SYSINIT_POSIX_SHM 000369 #define RTEMS_SYSINIT_POSIX_KEYS 00036a #define RTEMS_SYSINIT_POSIX_CLEANUP 00036b -- cgit v1.2.3