summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/macros
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2002-12-06 13:48:27 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2002-12-06 13:48:27 +0000
commit2837a5eace3af05a8eb2047a5b119cf1952cc631 (patch)
treeb6a9266f26a964d37470ae44d899eb498ef33195 /cpukit/posix/macros
parent2002-12-06 Ralf Corsepius <corsepiu@faw.uni-ulm.de> (diff)
downloadrtems-2837a5eace3af05a8eb2047a5b119cf1952cc631.tar.bz2
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.
Diffstat (limited to 'cpukit/posix/macros')
-rw-r--r--cpukit/posix/macros/rtems/posix/cond.inl45
1 files changed, 37 insertions, 8 deletions
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