diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-22 14:37:13 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-27 08:50:41 +0200 |
commit | 7f4ee2b4ae39928ab5f449048e562ef6b2c5d17d (patch) | |
tree | ec62caff9b95826169b43cc8a8e66b24fa861015 /cpukit/posix/include | |
parent | telnetd: Fix warnings (diff) | |
download | rtems-7f4ee2b4ae39928ab5f449048e562ef6b2c5d17d.tar.bz2 |
posix: Avoid Giant lock for condition variables
Update #2555.
Diffstat (limited to 'cpukit/posix/include')
-rw-r--r-- | cpukit/posix/include/rtems/posix/cond.h | 3 | ||||
-rw-r--r-- | cpukit/posix/include/rtems/posix/condimpl.h | 52 | ||||
-rw-r--r-- | cpukit/posix/include/rtems/posix/muteximpl.h | 10 |
3 files changed, 47 insertions, 18 deletions
diff --git a/cpukit/posix/include/rtems/posix/cond.h b/cpukit/posix/include/rtems/posix/cond.h index 1839279591..4fa7de7525 100644 --- a/cpukit/posix/include/rtems/posix/cond.h +++ b/cpukit/posix/include/rtems/posix/cond.h @@ -43,8 +43,7 @@ extern "C" { typedef struct { Objects_Control Object; Thread_queue_Control Wait_queue; - int process_shared; - pthread_mutex_t Mutex; + pthread_mutex_t mutex; } POSIX_Condition_variables_Control; #ifdef __cplusplus diff --git a/cpukit/posix/include/rtems/posix/condimpl.h b/cpukit/posix/include/rtems/posix/condimpl.h index b079a43233..b17886948e 100644 --- a/cpukit/posix/include/rtems/posix/condimpl.h +++ b/cpukit/posix/include/rtems/posix/condimpl.h @@ -20,7 +20,8 @@ #include <rtems/posix/cond.h> #include <rtems/score/objectimpl.h> #include <rtems/score/threadqimpl.h> -#include <rtems/score/watchdog.h> + +#include <errno.h> #ifdef __cplusplus extern "C" { @@ -45,6 +46,37 @@ extern Objects_Information _POSIX_Condition_variables_Information; */ extern const pthread_condattr_t _POSIX_Condition_variables_Default_attributes; +RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Initialize( + POSIX_Condition_variables_Control *the_cond +) +{ + _Thread_queue_Initialize( &the_cond->Wait_queue ); + the_cond->mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; +} + +RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Destroy( + POSIX_Condition_variables_Control *the_cond +) +{ + _Thread_queue_Destroy( &the_cond->Wait_queue ); +} + +RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Acquire_critical( + POSIX_Condition_variables_Control *the_cond, + ISR_lock_Context *lock_context +) +{ + _Thread_queue_Acquire_critical( &the_cond->Wait_queue, lock_context ); +} + +RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Release( + POSIX_Condition_variables_Control *the_cond, + ISR_lock_Context *lock_context +) +{ + _Thread_queue_Release( &the_cond->Wait_queue, lock_context ); +} + /** * @brief POSIX Condition Variable Allocate * @@ -68,27 +100,15 @@ RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free ( POSIX_Condition_variables_Control *the_condition_variable ) { - _Thread_queue_Destroy( &the_condition_variable->Wait_queue ); _Objects_Free( &_POSIX_Condition_variables_Information, &the_condition_variable->Object ); } -/** - * @brief POSIX Condition Variable Get - * - * This function maps condition variable IDs to condition variable control - * blocks. If ID corresponds to a local condition variable, then it returns - * the_condition variable control pointer which maps to ID and location - * is set to OBJECTS_LOCAL. if the condition variable ID is global and - * resides on a remote node, then location is set to OBJECTS_REMOTE, - * and the_condition variable is undefined. Otherwise, location is set - * to OBJECTS_ERROR and the_condition variable is undefined. - */ -POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get ( - pthread_cond_t *cond, - Objects_Locations *location +POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get( + pthread_cond_t *cond, + ISR_lock_Context *lock_context ); /** diff --git a/cpukit/posix/include/rtems/posix/muteximpl.h b/cpukit/posix/include/rtems/posix/muteximpl.h index fb30d5810e..6d21e96f6e 100644 --- a/cpukit/posix/include/rtems/posix/muteximpl.h +++ b/cpukit/posix/include/rtems/posix/muteximpl.h @@ -131,6 +131,16 @@ POSIX_Mutex_Control *_POSIX_Mutex_Get_interrupt_disable( ISR_lock_Context *lock_context ); +RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Get_no_protection( + const pthread_mutex_t *mutex +) +{ + return (POSIX_Mutex_Control *) _Objects_Get_no_protection( + (Objects_Id) *mutex, + &_POSIX_Mutex_Information + ); +} + #ifdef __cplusplus } #endif |