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/macros/rtems/posix/cond.inl | 45 ++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 8 deletions(-) (limited to 'cpukit/posix/macros') 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