summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/include/rtems
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-09-26 07:49:17 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-10-05 14:29:02 +0200
commit5222488573e3ba8c2eceffe29f878a73a3a81694 (patch)
tree4b4ca72268b8f40da493ca252780c197bd23a5ef /cpukit/posix/include/rtems
parentposix: Implement self-contained POSIX rwlocks (diff)
downloadrtems-5222488573e3ba8c2eceffe29f878a73a3a81694.tar.bz2
posix: Implement self-contained POSIX condvar
POSIX condition variables are now available in all configurations and no longer depend on --enable-posix. Update #2514. Update #3113.
Diffstat (limited to 'cpukit/posix/include/rtems')
-rw-r--r--cpukit/posix/include/rtems/posix/cond.h57
-rw-r--r--cpukit/posix/include/rtems/posix/condimpl.h132
-rw-r--r--cpukit/posix/include/rtems/posix/config.h6
3 files changed, 84 insertions, 111 deletions
diff --git a/cpukit/posix/include/rtems/posix/cond.h b/cpukit/posix/include/rtems/posix/cond.h
deleted file mode 100644
index 52b9a59929..0000000000
--- a/cpukit/posix/include/rtems/posix/cond.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * @file
- *
- * @brief POSIX Condition Variables Private Support
- *
- * This include file contains all the private support information for
- * POSIX condition variables.
- */
-
-/*
- * 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_COND_H
-#define _RTEMS_POSIX_COND_H
-
-#include <rtems/score/object.h>
-#include <rtems/score/threadq.h>
-
-#include <pthread.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup POSIX_COND_VARS POSIX Condition Variables
- *
- * @ingroup POSIXAPI
- *
- */
-/**@{**/
-
-/*
- * Data Structure used to manage a POSIX condition variable
- */
-
-typedef struct {
- Objects_Control Object;
- Thread_queue_Control Wait_queue;
- pthread_mutex_t *mutex;
- clockid_t clock;
-} POSIX_Condition_variables_Control;
-
-#ifdef __cplusplus
-}
-#endif
-
-/** @} */
-
-#endif
-/* end of include file */
diff --git a/cpukit/posix/include/rtems/posix/condimpl.h b/cpukit/posix/include/rtems/posix/condimpl.h
index e9375c1075..66e09bf6d8 100644
--- a/cpukit/posix/include/rtems/posix/condimpl.h
+++ b/cpukit/posix/include/rtems/posix/condimpl.h
@@ -16,17 +16,29 @@
#ifndef _RTEMS_POSIX_CONDIMPL_H
#define _RTEMS_POSIX_CONDIMPL_H
-
-#include <rtems/posix/cond.h>
-#include <rtems/score/objectimpl.h>
-#include <rtems/score/threadqimpl.h>
#include <errno.h>
+#include <pthread.h>
+
+#include <rtems/score/percpu.h>
+#include <rtems/score/threadqimpl.h>
#ifdef __cplusplus
extern "C" {
#endif
+typedef struct {
+ unsigned long flags;
+ Thread_queue_Syslock_queue Queue;
+ pthread_mutex_t *mutex;
+} POSIX_Condition_variables_Control;
+
+#define POSIX_CONDITION_VARIABLES_CLOCK_MONOTONIC 0x1UL
+
+#define POSIX_CONDITION_VARIABLES_FLAGS_MASK 0x1UL
+
+#define POSIX_CONDITION_VARIABLES_MAGIC 0x18dfb1feUL
+
/**
* Constant to indicate condition variable does not currently have
* a mutex assigned to it.
@@ -37,86 +49,89 @@ extern "C" {
#define POSIX_CONDITION_VARIABLE_OF_THREAD_QUEUE_QUEUE( queue ) \
RTEMS_CONTAINER_OF( \
- queue, POSIX_Condition_variables_Control, Wait_queue.Queue )
-
-/**
- * The following defines the information control block used to manage
- * this class of objects.
- */
-extern Objects_Information _POSIX_Condition_variables_Information;
+ queue, POSIX_Condition_variables_Control, Queue.Queue )
/**
* The default condition variable attributes structure.
*/
extern const pthread_condattr_t _POSIX_Condition_variables_Default_attributes;
+static inline POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get(
+ pthread_cond_t *cond
+)
+{
+ return (POSIX_Condition_variables_Control *) cond;
+}
+
RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Initialize(
POSIX_Condition_variables_Control *the_cond,
const pthread_condattr_t *the_attr
)
{
- _Thread_queue_Object_initialize( &the_cond->Wait_queue );
+ unsigned long flags;
+
+ _Thread_queue_Queue_initialize( &the_cond->Queue.Queue, NULL );
the_cond->mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
- the_cond->clock = the_attr->clock;
+
+ flags = (uintptr_t) the_cond ^ POSIX_CONDITION_VARIABLES_MAGIC;
+ flags &= ~POSIX_CONDITION_VARIABLES_FLAGS_MASK;
+
+ if ( the_attr->clock == CLOCK_MONOTONIC ) {
+ flags |= POSIX_CONDITION_VARIABLES_CLOCK_MONOTONIC;
+ }
+
+ the_cond->flags = flags;
}
RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Destroy(
POSIX_Condition_variables_Control *the_cond
)
{
- _Thread_queue_Destroy( &the_cond->Wait_queue );
+ the_cond->flags = ~the_cond->flags;
}
-RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Acquire_critical(
- POSIX_Condition_variables_Control *the_cond,
- Thread_queue_Context *queue_context
+RTEMS_INLINE_ROUTINE clockid_t _POSIX_Condition_variables_Get_clock(
+ unsigned long flags
)
{
- _Thread_queue_Acquire_critical( &the_cond->Wait_queue, queue_context );
+ if ( ( flags & POSIX_CONDITION_VARIABLES_CLOCK_MONOTONIC ) != 0 ) {
+ return CLOCK_MONOTONIC;
+ }
+
+ return CLOCK_REALTIME;
}
-RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Release(
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Condition_variables_Acquire(
POSIX_Condition_variables_Control *the_cond,
Thread_queue_Context *queue_context
)
{
- _Thread_queue_Release( &the_cond->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_cond->Queue.Queue,
+ &executing->Potpourri_stats,
+ &queue_context->Lock_context.Lock_context
+ );
-/**
- * @brief POSIX Condition Variable Allocate
- *
- * This function allocates a condition variable control block from
- * the inactive chain of free condition variable control blocks.
- */
-RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *
- _POSIX_Condition_variables_Allocate( void )
-{
- return (POSIX_Condition_variables_Control *)
- _Objects_Allocate( &_POSIX_Condition_variables_Information );
+ return executing;
}
-/**
- * @brief POSIX Condition Variable Free
- *
- * This routine frees a condition variable control block to the
- * inactive chain of free condition variable control blocks.
- */
-RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free (
- POSIX_Condition_variables_Control *the_condition_variable
+RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Release(
+ POSIX_Condition_variables_Control *the_cond,
+ Thread_queue_Context *queue_context
)
{
- _Objects_Free(
- &_POSIX_Condition_variables_Information,
- &the_condition_variable->Object
+ _Thread_queue_Queue_release(
+ &the_cond->Queue.Queue,
+ &queue_context->Lock_context.Lock_context
);
}
-POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get(
- pthread_cond_t *cond,
- Thread_queue_Context *queue_context
-);
-
/**
* @brief Implements wake up version of the "signal" operation.
*
@@ -140,6 +155,27 @@ int _POSIX_Condition_variables_Wait_support(
const struct timespec *abstime
);
+bool _POSIX_Condition_variables_Auto_initialization(
+ POSIX_Condition_variables_Control *the_cond
+);
+
+#define POSIX_CONDITION_VARIABLES_VALIDATE_OBJECT( the_cond, flags ) \
+ do { \
+ if ( ( the_cond ) == NULL ) { \
+ return EINVAL; \
+ } \
+ flags = ( the_cond )->flags; \
+ if ( \
+ ( ( (uintptr_t) ( the_cond ) ^ POSIX_CONDITION_VARIABLES_MAGIC ) \
+ & ~POSIX_CONDITION_VARIABLES_FLAGS_MASK ) \
+ != ( flags & ~POSIX_CONDITION_VARIABLES_FLAGS_MASK ) \
+ ) { \
+ if ( !_POSIX_Condition_variables_Auto_initialization( the_cond ) ) { \
+ 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 799eb62f03..2f5a5d7600 100644
--- a/cpukit/posix/include/rtems/posix/config.h
+++ b/cpukit/posix/include/rtems/posix/config.h
@@ -70,12 +70,6 @@ typedef struct {
/**
* This field contains the maximum number of POSIX API
- * condition variables which are configured for this application.
- */
- uint32_t maximum_condition_variables;
-
- /**
- * This field contains the maximum number of POSIX API
* timers which are configured for this application.
*/
uint32_t maximum_timers;