Accept all priority values in pthread_mutexattr_setprioceiling(). This is in line with POSIX and FreeBSD. The priority is validated in pthread_mutex_init(). Validate the priority only for priority ceiling mutexes. --- cpukit/posix/src/mutexattrsetprioceiling.c | 9 --------- cpukit/posix/src/mutexinit.c | 19 +++++++++++-------- testsuites/psxtests/psx05/init.c | 23 +++++++++++++++-------- testsuites/psxtests/psx05/psx05.scn | 13 ++++++++----- 4 files changed, 34 insertions(+), 30 deletions(-)
diff --git a/cpukit/posix/src/mutexattrsetprioceiling.c b/cpukit/posix/src/mutexattrsetprioceiling.c index ba377a9..3411121 100644 --- a/cpukit/posix/src/mutexattrsetprioceiling.c +++ b/cpukit/posix/src/mutexattrsetprioceiling.c @@ -21,12 +21,6 @@ #include <errno.h> #include <pthread.h> -#include <rtems/system.h> -#include <rtems/score/coremuteximpl.h> -#include <rtems/score/watchdog.h> -#include <rtems/posix/muteximpl.h> -#include <rtems/posix/priorityimpl.h> - /* * 13.6.1 Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128 */ @@ -39,9 +33,6 @@ int pthread_mutexattr_setprioceiling( if ( !attr || !attr->is_initialized ) return EINVAL; - if ( !_POSIX_Priority_Is_valid( prioceiling ) ) - return EINVAL; - attr->prio_ceiling = prioceiling; return 0; } diff --git a/cpukit/posix/src/mutexinit.c b/cpukit/posix/src/mutexinit.c index 73f0544..3459df7 100644 --- a/cpukit/posix/src/mutexinit.c +++ b/cpukit/posix/src/mutexinit.c @@ -36,6 +36,7 @@ int pthread_mutex_init( POSIX_Mutex_Control *the_mutex; const pthread_mutexattr_t *the_attr; POSIX_Mutex_Protocol protocol; + Priority_Control priority; if ( attr ) the_attr = attr; else the_attr = &_POSIX_Mutex_Default_attributes; @@ -86,12 +87,6 @@ int pthread_mutex_init( return EINVAL; } - /* - * Validate the priority ceiling field -- should always be valid. - */ - if ( !_POSIX_Priority_Is_valid( the_attr->prio_ceiling ) ) - return EINVAL; - #if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) /* * Validate the mutex type and set appropriate SuperCore mutex @@ -109,6 +104,14 @@ int pthread_mutex_init( } #endif + if ( protocol == POSIX_MUTEX_PRIORITY_CEILING ) { + if ( !_POSIX_Priority_Is_valid( the_attr->prio_ceiling ) ) { + return EINVAL; + } + + priority = _POSIX_Priority_To_core( the_attr->prio_ceiling ); + } + the_mutex = _POSIX_Mutex_Allocate(); if ( !the_mutex ) { @@ -119,11 +122,11 @@ int pthread_mutex_init( the_mutex->protocol = protocol; the_mutex->is_recursive = ( the_attr->type == PTHREAD_MUTEX_RECURSIVE ); - switch ( the_mutex->protocol ) { + switch ( protocol ) { case POSIX_MUTEX_PRIORITY_CEILING: _CORE_ceiling_mutex_Initialize( &the_mutex->Mutex, - _POSIX_Priority_To_core( the_attr->prio_ceiling ) + priority ); break; default: diff --git a/testsuites/psxtests/psx05/init.c b/testsuites/psxtests/psx05/init.c index bbc863a..5f39b2f 100644 --- a/testsuites/psxtests/psx05/init.c +++ b/testsuites/psxtests/psx05/init.c @@ -16,6 +16,7 @@ #define CONFIGURE_INIT #include "system.h" #include <errno.h> +#include <limits.h> #include <rtems/score/todimpl.h> @@ -375,11 +376,13 @@ void *POSIX_Init( status = pthread_mutexattr_setprioceiling( NULL, 128 ); rtems_test_assert( status == EINVAL ); - puts( "Init: pthread_mutexattr_setprioceiling - EINVAL (invalid priority)" ); - status = pthread_mutexattr_setprioceiling( &attr, 512 ); - if ( status != EINVAL ) - printf( "status = %d\n", status ); - rtems_test_assert( status == EINVAL ); + puts( "Init: pthread_mutexattr_setprioceiling - SUCCESSFUL (priority INT_MAX)" ); + status = pthread_mutexattr_setprioceiling( &attr, INT_MAX ); + rtems_test_assert( status == 0 ); + + puts( "Init: pthread_mutexattr_setprioceiling - SUCCESSFUL (priority INT_MIN)" ); + status = pthread_mutexattr_setprioceiling( &attr, INT_MIN ); + rtems_test_assert( status == 0 ); puts( "Init: pthread_mutexattr_setprioceiling - EINVAL (not initialized)" ); status = pthread_mutexattr_setprioceiling( &destroyed_attr, -1 ); @@ -409,9 +412,13 @@ void *POSIX_Init( status = pthread_mutex_init( &Mutex_id, &attr ); rtems_test_assert( status == EINVAL ); - /* must get around error checks in attribute set routines */ - attr.protocol = PTHREAD_PRIO_INHERIT; - attr.prio_ceiling = -1; + puts( "Init: pthread_mutexattr_setprotocol - SUCCESSFUL" ); + status = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_PROTECT ); + rtems_test_assert( !status ); + + puts( "Init: pthread_mutexattr_setprioceiling - SUCCESSFUL" ); + status = pthread_mutexattr_setprioceiling( &attr, -1 ); + rtems_test_assert( !status ); puts( "Init: pthread_mutex_init - EINVAL (bad priority ceiling)" ); status = pthread_mutex_init( &Mutex_id, &attr ); diff --git a/testsuites/psxtests/psx05/psx05.scn b/testsuites/psxtests/psx05/psx05.scn index 8fa3e23..4e66cea 100644 --- a/testsuites/psxtests/psx05/psx05.scn +++ b/testsuites/psxtests/psx05/psx05.scn @@ -1,4 +1,4 @@ -*** POSIX TEST 5 *** +*** BEGIN OF TEST PSX 5 *** Init's ID is 0x0b010001 Init: pthread_mutexattr_init - EINVAL (NULL attr) Init: pthread_mutexattr_init - SUCCESSFUL @@ -26,12 +26,15 @@ Init: pthread_mutexattr_getprioceiling - EINVAL (NULL attr) Init: pthread_mutexattr_getprioceiling - EINVAL (NULL prioceiling) Init: pthread_mutexattr_getprioceiling - EINVAL (not initialized) Init: pthread_mutexattr_setprioceiling - EINVAL (NULL attr) -Init: pthread_mutexattr_setprioceiling - EINVAL (invalid priority) +Init: pthread_mutexattr_setprioceiling - SUCCESSFUL (priority INT_MAX) +Init: pthread_mutexattr_setprioceiling - SUCCESSFUL (priority INT_MIN) Init: pthread_mutexattr_setprioceiling - EINVAL (not initialized) Init: pthread_mutex_init - EINVAL (NULL mutex_id) Init: pthread_mutex_init - EINVAL (not initialized attr) Init: pthread_mutex_init - EINVAL (bad protocol) +Init: pthread_mutexattr_setprotocol - SUCCESSFUL +Init: pthread_mutexattr_setprioceiling - SUCCESSFUL Init: pthread_mutex_init - EINVAL (bad priority ceiling) Init: Resetting mutex attributes Init: pthread_mutex_init - ENOSYS (process wide scope) @@ -82,7 +85,7 @@ Init: pthread_mutex_init - SUCCESSFUL Init: pthread_mutex_trylock - SUCCESSFUL Init: pthread_setschedparam - Setting Task2 priority to highest Task 2: pthread_mutex_lock unavailable (inherit case) -Init: pthread_getschedparam - priority = 254 +Init: pthread_getschedparam - priority = 2 Init: pthread_mutex_unlock - SUCCESSFUL Task 2: mutex acquired Task 2: unlock Mutex 2 @@ -103,7 +106,7 @@ Init: pthread_mutex_setprioceiling - new ceiling = 200 Init: pthread_mutex_setprioceiling - old ceiling = 254 Init: pthread_getschedparam - priority = 2 Init: pthread_mutex_trylock - SUCCESSFUL -Init: pthread_getschedparam - priority = 200 +Init: pthread_getschedparam - priority = 2 Init: pthread_setschedparam - set Task3 priority to highest Init: Sleep 1 second Task 3: pthread_mutex_lock unavailable (inherit case) @@ -116,4 +119,4 @@ Init: pthread_mutex_getprioceiling- ceiling = 200 Init: pthread_setschedparam - set Init priority to highest Init: pthread_mutex_lock - EINVAL (priority ceiling violation) Init: Recursive Mutex -*** END OF POSIX TEST 5 *** +*** END OF TEST PSX 5 *** -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel