[PATCH 01/16] posix: pthread_mutexattr_setprioceiling()

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Jun 17 10:51:38 UTC 2016


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



More information about the devel mailing list