mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-11-15 11:10:11 +08:00
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:
1 parent
7fbe680567
commit
4d3200628d
8 files changed
+208
-100
No files matched your search
@@ -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.
|
||||
|
||||
@@ -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 \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
Reference in new issue
Block a user