2008-01-09 Joel Sherrill <joel.sherrill@OARcorp.com>

* posix/Makefile.am, posix/include/rtems/posix/cond.h,
	posix/include/rtems/posix/mutex.h, posix/inline/rtems/posix/cond.inl,
	posix/inline/rtems/posix/mutex.inl: Do not include POSIX Mutex or
	Condition Variable object get helpers because they are more
	complicated than the norm. They can implicitly perform a create. They
	cross the line as being too complex and large to inline since they
	negatively impact size and binary test coverage.
	* posix/src/condget.c, posix/src/mutexget.c: New files.
This commit is contained in:
Joel Sherrill committed 2008-01-09 22:08:31 +00:00
1 parent 7fbe680567
commit 4d3200628d
8 files changed
+208 -100

No files matched your search

+11
View File
@@ -1,3 +1,14 @@
2008-01-09 Joel Sherrill <joel.sherrill@OARcorp.com>
* posix/Makefile.am, posix/include/rtems/posix/cond.h,
posix/include/rtems/posix/mutex.h, posix/inline/rtems/posix/cond.inl,
posix/inline/rtems/posix/mutex.inl: Do not include POSIX Mutex or
Condition Variable object get helpers because they are more
complicated than the norm. They can implicitly perform a create. They
cross the line as being too complex and large to inline since they
negatively impact size and binary test coverage.
* posix/src/condget.c, posix/src/mutexget.c: New files.
2008-01-09 Joel Sherrill <joel.sherrill@oarcorp.com>
* libcsupport/Makefile.am: Add src/malloc_dirtier.c.
+2 -2
View File
@@ -77,7 +77,7 @@ libposix_a_SOURCES += src/cond.c src/condattrdestroy.c \
src/condattrgetpshared.c src/condattrinit.c src/condattrsetpshared.c \
src/condbroadcast.c src/conddefaultattributes.c src/conddestroy.c \
src/condinit.c src/condsignal.c src/condsignalsupp.c \
src/condtimedwait.c src/condwait.c src/condwaitsupp.c
src/condtimedwait.c src/condwait.c src/condwaitsupp.c src/condget.c
## KEY_C_FILES
libposix_a_SOURCES += src/key.c src/keycreate.c src/keydelete.c \
@@ -105,7 +105,7 @@ libposix_a_SOURCES += src/mutex.c src/mutexattrdestroy.c \
src/mutexdestroy.c src/mutexgetprioceiling.c src/mutexinit.c \
src/mutexlock.c src/mutexlocksupp.c src/mutexsetprioceiling.c \
src/mutextimedlock.c src/mutextranslatereturncode.c src/mutextrylock.c \
src/mutexunlock.c
src/mutexunlock.c src/mutexget.c
## PTHREAD_C_FILES
libposix_a_SOURCES += src/pthread.c src/pthreadsetcputime.c \
+15
View File
@@ -158,6 +158,21 @@ int _POSIX_Condition_variables_Wait_support(
boolean already_timedout
);
/*
* _POSIX_Condition_variables_Get
*
* DESCRIPTION:
*
* A support routine which translates the condition variable id into
* a local pointer. As a side-effect, it may create the condition
* variable.
*/
POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
pthread_cond_t *cond,
Objects_Locations *location
);
#include <rtems/posix/cond.inl>
#ifdef __cplusplus
+37
View File
@@ -147,6 +147,43 @@ int _POSIX_Mutex_Translate_core_mutex_return_code(
);
/*
* _POSIX_Mutex_Get
*
* DESCRIPTION:
*
* A support routine which translates the mutex id into a local pointer.
* As a side-effect, it may create the mutex.
*
* NOTE:
*
* This version of the method uses a dispatching critical section.
*/
POSIX_Mutex_Control *_POSIX_Mutex_Get (
pthread_mutex_t *mutex,
Objects_Locations *location
);
/*
* _POSIX_Mutex_Get
*
* DESCRIPTION:
*
* A support routine which translates the mutex id into a local pointer.
* As a side-effect, it may create the mutex.
*
* NOTE:
*
* This version of the method uses an interrupt critical section.
*/
POSIX_Mutex_Control *_POSIX_Mutex_Get_interrupt_disable (
pthread_mutex_t *mutex,
Objects_Locations *location,
ISR_Level *level
);
#include <rtems/posix/mutex.inl>
#ifdef __cplusplus
-39
View File
@@ -49,45 +49,6 @@ RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free (
);
}
/*PAGE
*
* _POSIX_Condition_variables_Get
*/
RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
*_POSIX_Condition_variables_Get (
pthread_cond_t *cond,
Objects_Locations *location
)
{
Objects_Id *id = (Objects_Id *)cond;
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( (pthread_cond_t *)id, 0 );
if ( status ) {
*location = OBJECTS_ERROR;
return (POSIX_Condition_variables_Control *) 0;
}
}
/*
* Now call Objects_Get()
*/
return (POSIX_Condition_variables_Control *)
_Objects_Get( &_POSIX_Condition_variables_Information, *id, location );
}
/*PAGE
*
* _POSIX_Condition_variables_Is_null
-59
View File
@@ -42,65 +42,6 @@ RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Free (
_Objects_Free( &_POSIX_Mutex_Information, &the_mutex->Object );
}
/*PAGE
*
* _POSIX_Mutex_Get_support
*
* NOTE: The support macro makes it possible for both to use exactly
* the same code to check for NULL id pointer and
* PTHREAD_MUTEX_INITIALIZER without adding overhead.
*/
#define ___POSIX_Mutex_Get_support( _id, _location ) \
do { \
int _status; \
\
if ( !_id ) { \
*_location = OBJECTS_ERROR; \
return (POSIX_Mutex_Control *) 0; \
} \
\
if ( *_id == PTHREAD_MUTEX_INITIALIZER ) { \
/* \
* Do an "auto-create" here. \
*/ \
\
_status = pthread_mutex_init( (pthread_mutex_t *)_id, 0 ); \
if ( _status ) { \
*_location = OBJECTS_ERROR; \
return (POSIX_Mutex_Control *) 0; \
} \
} \
} while (0)
RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Get (
pthread_mutex_t *mutex,
Objects_Locations *location
)
{
Objects_Id *id = (Objects_Id *)mutex;
___POSIX_Mutex_Get_support( id, location );
return (POSIX_Mutex_Control *)
_Objects_Get( &_POSIX_Mutex_Information, *id, location );
}
RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Get_interrupt_disable (
pthread_mutex_t *mutex,
Objects_Locations *location,
ISR_Level *level
)
{
Objects_Id *id = (Objects_Id *)mutex;
___POSIX_Mutex_Get_support( id, location );
return (POSIX_Mutex_Control *)
_Objects_Get_isr_disable( &_POSIX_Mutex_Information, *id, location, level );
}
/*PAGE
*
* _POSIX_Mutex_Is_null
+59
View File
@@ -0,0 +1,59 @@
/*
* COPYRIGHT (c) 1989-2007.
* 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.com/license/LICENSE.
*
* $Id$
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <pthread.h>
#include <errno.h>
#include <rtems/system.h>
#include <rtems/score/object.h>
#include <rtems/score/states.h>
#include <rtems/score/watchdog.h>
#include <rtems/posix/cond.h>
#include <rtems/posix/time.h>
#include <rtems/posix/mutex.h>
POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
pthread_cond_t *cond,
Objects_Locations *location
)
{
Objects_Id *id = (Objects_Id *)cond;
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( (pthread_cond_t *)id, 0 );
if ( status ) {
*location = OBJECTS_ERROR;
return (POSIX_Condition_variables_Control *) 0;
}
}
/*
* Now call Objects_Get()
*/
return (POSIX_Condition_variables_Control *)
_Objects_Get( &_POSIX_Condition_variables_Information, *id, location );
}
+84
View File
@@ -0,0 +1,84 @@
/*
* Convert POSIX Mutex ID to local object pointer
*
* COPYRIGHT (c) 1989-2007.
* 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.com/license/LICENSE.
*
* $Id$
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <errno.h>
#include <pthread.h>
#include <rtems/system.h>
#include <rtems/score/coremutex.h>
#if defined(RTEMS_MULTIPROCESSING)
#include <rtems/score/mpci.h>
#endif
#include <rtems/posix/mutex.h>
/*
* _POSIX_Mutex_Get_support
*
* NOTE: The support macro makes it possible for both to use exactly
* the same code to check for NULL id pointer and
* PTHREAD_MUTEX_INITIALIZER without adding overhead.
*/
#define ___POSIX_Mutex_Get_support( _id, _location ) \
do { \
int _status; \
\
if ( !_id ) { \
*_location = OBJECTS_ERROR; \
return (POSIX_Mutex_Control *) 0; \
} \
\
if ( *_id == PTHREAD_MUTEX_INITIALIZER ) { \
/* \
* Do an "auto-create" here. \
*/ \
\
_status = pthread_mutex_init( (pthread_mutex_t *)_id, 0 ); \
if ( _status ) { \
*_location = OBJECTS_ERROR; \
return (POSIX_Mutex_Control *) 0; \
} \
} \
} while (0)
POSIX_Mutex_Control *_POSIX_Mutex_Get (
pthread_mutex_t *mutex,
Objects_Locations *location
)
{
Objects_Id *id = (Objects_Id *)mutex;
___POSIX_Mutex_Get_support( id, location );
return (POSIX_Mutex_Control *)
_Objects_Get( &_POSIX_Mutex_Information, *id, location );
}
POSIX_Mutex_Control *_POSIX_Mutex_Get_interrupt_disable (
pthread_mutex_t *mutex,
Objects_Locations *location,
ISR_Level *level
)
{
Objects_Id *id = (Objects_Id *)mutex;
___POSIX_Mutex_Get_support( id, location );
return (POSIX_Mutex_Control *)
_Objects_Get_isr_disable( &_POSIX_Mutex_Information, *id, location, level );
}