From 2837a5eace3af05a8eb2047a5b119cf1952cc631 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 6 Dec 2002 13:48:27 +0000 Subject: 2002-12-06 Vladimir Nesic * 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. --- cpukit/posix/ChangeLog | 6 +++++ cpukit/posix/inline/rtems/posix/cond.inl | 39 ++++++++++++++++++++------- cpukit/posix/macros/rtems/posix/cond.inl | 45 ++++++++++++++++++++++++++------ 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 + + * 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 * 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 + /*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 + /*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 -- cgit v1.2.3