summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cpukit/posix/ChangeLog6
-rw-r--r--cpukit/posix/inline/rtems/posix/cond.inl39
-rw-r--r--cpukit/posix/macros/rtems/posix/cond.inl45
3 files changed, 73 insertions, 17 deletions
diff --git a/cpukit/posix/ChangeLog b/cpukit/posix/ChangeLog
index 045b1018e3..80b450c3b8 100644
--- a/cpukit/posix/ChangeLog
+++ b/cpukit/posix/ChangeLog
@@ -1,3 +1,9 @@
+2002-12-06 Vladimir Nesic <vnesic@dkts.co.yu>
+
+ * inline/rtems/posix/cond.inl, macros/rtems/posix/cond.inl:
+ Implemented PTHREAD_COND_INITIALIZER support. Vladimir implemented
+ the inline version and Joel adapted it to the macro version.
+
2002-12-02 Joel Sherrill <joel@OARcorp.com>
* include/rtems/posix/timer.h, src/keygetspecific.c,
diff --git a/cpukit/posix/inline/rtems/posix/cond.inl b/cpukit/posix/inline/rtems/posix/cond.inl
index 19d5c6ec4b..4d5f8612de 100644
--- a/cpukit/posix/inline/rtems/posix/cond.inl
+++ b/cpukit/posix/inline/rtems/posix/cond.inl
@@ -3,7 +3,7 @@
* This include file contains the static inline implementation of the private
* inlined routines for POSIX condition variables.
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -16,6 +16,8 @@
#ifndef __RTEMS_POSIX_CONDITION_VARIABLES_inl
#define __RTEMS_POSIX_CONDITION_VARIABLES_inl
+#include <pthread.h>
+
/*PAGE
*
* _POSIX_Condition_variables_Allocate
@@ -47,19 +49,38 @@ RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free (
*
* _POSIX_Condition_variables_Get
*/
-
-RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
+*_POSIX_Condition_variables_Get (
Objects_Id *id,
Objects_Locations *location
)
{
-/* XXX should support COND_INITIALIZER */
- if ( id )
- return (POSIX_Condition_variables_Control *)
- _Objects_Get( &_POSIX_Condition_variables_Information, *id, location );
+ int status;
+
+ if ( !id ) {
+ *location = OBJECTS_ERROR;
+ return (POSIX_Condition_variables_Control *) 0;
+ }
+
+ if ( *id == PTHREAD_COND_INITIALIZER ) {
+ /*
+ * Do an "auto-create" here.
+ */
+
+ status = pthread_cond_init( id, 0 );
+ if ( status ) {
+ *location = OBJECTS_ERROR;
+ return (POSIX_Condition_variables_Control *) 0;
+ }
+ }
+
+ /*
+ * Now call Objects_Get()
+ */
- *location = OBJECTS_ERROR;
- return NULL;
+ return (POSIX_Condition_variables_Control *)
+ _Objects_Get( &_POSIX_Condition_variables_Information, *id, location );
}
/*PAGE
diff --git a/cpukit/posix/macros/rtems/posix/cond.inl b/cpukit/posix/macros/rtems/posix/cond.inl
index 96557a36e1..a6d3b26a22 100644
--- a/cpukit/posix/macros/rtems/posix/cond.inl
+++ b/cpukit/posix/macros/rtems/posix/cond.inl
@@ -3,7 +3,7 @@
* This include file contains the macro implementation of the private
* inlined routines for POSIX condition variables.
*
- * COPYRIGHT (c) 1989-1999.
+ * COPYRIGHT (c) 1989-2002.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -16,6 +16,8 @@
#ifndef __RTEMS_POSIX_CONDITION_VARIABLES_inl
#define __RTEMS_POSIX_CONDITION_VARIABLES_inl
+#include <pthread.h>
+
/*PAGE
*
* _POSIX_Condition_variables_Allocate
@@ -28,6 +30,10 @@
/*PAGE
*
* _POSIX_Condition_variables_Free
+ *
+ * NOTE: The support macro makes it possible for both to use exactly
+ * the same code to check for NULL id pointer and
+ * PTHREAD_COND_INITIALIZER without adding overhead.
*/
#define _POSIX_Condition_variables_Free( _the_condition_variable ) \
@@ -37,21 +43,44 @@
/*PAGE
*
* _POSIX_Condition_variables_Get
+ *
+ * NOTE: The support macro makes it possible for both to use exactly
+ * the same code to check for NULL id pointer and
+ * PTHREAD_COND_INITIALIZER without adding overhead.
*/
+
+#define ___POSIX_Condition_variables_Get_support( _id, _location ) \
+ do { \
+ int _status; \
+ \
+ if ( !_id ) { \
+ *_location = OBJECTS_ERROR; \
+ return (POSIX_Condition_variables_Control *) 0; \
+ } \
+ \
+ if ( *_id == PTHREAD_COND_INITIALIZER ) { \
+ /* \
+ * Do an "auto-create" here. \
+ */ \
+ \
+ _status = pthread_cond_init( _id, 0 ); \
+ if ( _status ) { \
+ *_location = OBJECTS_ERROR; \
+ return (POSIX_Condition_variables_Control *) 0; \
+ } \
+ } \
+ } while (0)
+
-/* XXX how to write this as a macro */
static POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
Objects_Id *id,
Objects_Locations *location
)
{
-/* XXX should support COND_INITIALIZER */
- if ( id )
- return (POSIX_Condition_variables_Control *)
- _Objects_Get( &_POSIX_Condition_variables_Information, *id, location );
+ ___POSIX_Condition_variables_Get_support( id, location );
- *location = OBJECTS_ERROR;
- return NULL;
+ return (POSIX_Condition_variables_Control *)
+ _Objects_Get( &_POSIX_Condition_variables_Information, *id, location );
}
/*PAGE