[rtems commit] score: _Thread_queue_Surrender_priority_ceiling()

Sebastian Huber sebh at rtems.org
Mon Oct 11 11:19:33 UTC 2021


Module:    rtems
Branch:    master
Commit:    d61fbeda590936ee03e91cf4b200f24d613e6ec2
Changeset: http://git.rtems.org/rtems/commit/?id=d61fbeda590936ee03e91cf4b200f24d613e6ec2

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Mon Oct 11 12:53:52 2021 +0200

score: _Thread_queue_Surrender_priority_ceiling()

Do not use a direct thread dispatch in
_Thread_queue_Surrender_priority_ceiling() since it may be used in condition
variables using POSIX mutexes.

Close #4526.

---

 cpukit/score/src/threadqenqueue.c |  4 ++--
 testsuites/psxtests/psx05/init.c  | 43 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/cpukit/score/src/threadqenqueue.c b/cpukit/score/src/threadqenqueue.c
index b3bf551..5fc357e 100644
--- a/cpukit/score/src/threadqenqueue.c
+++ b/cpukit/score/src/threadqenqueue.c
@@ -818,7 +818,7 @@ Status_Control _Thread_queue_Surrender_priority_ceiling(
       &queue_context->Lock_context.Lock_context
     );
     _Thread_Priority_update( queue_context );
-    _Thread_Dispatch_direct( cpu_self );
+    _Thread_Dispatch_enable( cpu_self );
     return STATUS_SUCCESSFUL;
   }
 
@@ -856,7 +856,7 @@ Status_Control _Thread_queue_Surrender_priority_ceiling(
     unblock
   );
 
-  _Thread_Dispatch_direct( cpu_self );
+  _Thread_Dispatch_enable( cpu_self );
   return STATUS_SUCCESSFUL;
 }
 
diff --git a/testsuites/psxtests/psx05/init.c b/testsuites/psxtests/psx05/init.c
index 2459166..4c1603d 100644
--- a/testsuites/psxtests/psx05/init.c
+++ b/testsuites/psxtests/psx05/init.c
@@ -406,6 +406,48 @@ static void test_mutex_auto_initialization( void )
   }
 }
 
+static void test_mutex_prio_protect_with_cv( void )
+{
+  pthread_mutex_t mutex;
+  pthread_mutexattr_t attr;
+  pthread_cond_t cond;
+  int eno;
+  struct timespec timeout;
+
+  eno = pthread_mutexattr_init( &attr );
+  rtems_test_assert( eno == 0 );
+
+  eno = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_PROTECT );
+  rtems_test_assert( eno == 0 );
+
+  eno = pthread_mutex_init( &mutex, &attr );
+  rtems_test_assert( eno == 0 );
+
+  eno = pthread_mutexattr_destroy( &attr );
+  rtems_test_assert( eno == 0 );
+
+  eno = pthread_cond_init( &cond, NULL );
+  rtems_test_assert( eno == 0 );
+
+  eno = pthread_mutex_lock( &mutex );
+  rtems_test_assert( eno == 0 );
+
+  timeout.tv_sec = 0;
+  timeout.tv_nsec = 0;
+
+  eno = pthread_cond_timedwait( &cond, &mutex, &timeout );
+  rtems_test_assert( eno == ETIMEDOUT );
+
+  eno = pthread_mutex_unlock( &mutex );
+  rtems_test_assert( eno == 0 );
+
+  eno = pthread_mutex_destroy( &mutex );
+  rtems_test_assert( eno == 0 );
+
+  eno = pthread_cond_destroy( &cond );
+  rtems_test_assert( eno == 0 );
+}
+
 void *POSIX_Init(
   void *argument
 )
@@ -431,6 +473,7 @@ void *POSIX_Init(
   test_mutex_not_initialized();
   test_mutex_invalid_copy();
   test_mutex_auto_initialization();
+  test_mutex_prio_protect_with_cv();
   test_get_priority();
   test_set_priority();
   test_errors_pthread_setschedprio();



More information about the vc mailing list