[PATCH] score: Fix initially locked prio inherit sema

Gedare Bloom gedare at rtems.org
Tue Aug 19 15:49:31 UTC 2014


Looks good.

On Tue, Aug 19, 2014 at 11:45 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> ---
>  cpukit/score/src/coremutex.c     | 15 +++++++++++----
>  testsuites/sptests/sp51/init.c   | 35 +++++++++++++++++++++++++++++++++++
>  testsuites/sptests/sp51/sp51.doc |  3 +++
>  3 files changed, 49 insertions(+), 4 deletions(-)
>
> diff --git a/cpukit/score/src/coremutex.c b/cpukit/score/src/coremutex.c
> index e13c7aa..949aa70 100644
> --- a/cpukit/score/src/coremutex.c
> +++ b/cpukit/score/src/coremutex.c
> @@ -39,10 +39,14 @@ CORE_mutex_Status _CORE_mutex_Initialize(
>    the_mutex->Attributes    = *the_mutex_attributes;
>
>    if ( initially_locked ) {
> +    bool is_priority_ceiling =
> +      _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes );
> +
>      the_mutex->nest_count = 1;
>      the_mutex->holder     = executing;
> -    if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
> -         _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) {
> +
> +    if (  is_priority_ceiling ||
> +         _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ) {
>        Priority_Control ceiling = the_mutex->Attributes.priority_ceiling;
>
>        /*
> @@ -52,7 +56,7 @@ CORE_mutex_Status _CORE_mutex_Initialize(
>         */
>        _Thread_Disable_dispatch();
>
> -      if ( executing->current_priority < ceiling ) {
> +      if ( is_priority_ceiling && executing->current_priority < ceiling ) {
>          _Thread_Enable_dispatch();
>          return CORE_MUTEX_STATUS_CEILING_VIOLATED;
>        }
> @@ -65,7 +69,10 @@ CORE_mutex_Status _CORE_mutex_Initialize(
>
>        executing->resource_count++;
>
> -      _Thread_Change_priority( executing, ceiling, false );
> +      if ( is_priority_ceiling ) {
> +        _Thread_Change_priority( executing, ceiling, false );
> +      }
> +
>        _Thread_Enable_dispatch();
>      }
>    } else {
> diff --git a/testsuites/sptests/sp51/init.c b/testsuites/sptests/sp51/init.c
> index 98d362f..8d36a30 100644
> --- a/testsuites/sptests/sp51/init.c
> +++ b/testsuites/sptests/sp51/init.c
> @@ -18,6 +18,39 @@ const char rtems_test_name[] = "SP 51";
>  /* forward declarations to avoid warnings */
>  rtems_task Init(rtems_task_argument argument);
>
> +static void test_create_initially_locked_prio_inherit_sema(void)
> +{
> +  rtems_status_code   sc;
> +  rtems_id            id;
> +  rtems_task_priority prio_a;
> +  rtems_task_priority prio_b;
> +
> +  sc = rtems_task_set_priority(RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio_a);
> +  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> +  rtems_test_assert(prio_a != 0);
> +
> +  sc = rtems_semaphore_create(
> +    rtems_build_name( 'S', 'E', 'M', 'A' ),
> +    0,
> +    RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,
> +    0,
> +    &id
> +  );
> +  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> +  sc = rtems_task_set_priority(RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &prio_b);
> +  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> +  rtems_test_assert(prio_a == prio_b);
> +
> +  sc = rtems_semaphore_release(id);
> +  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> +  sc = rtems_semaphore_delete(id);
> +  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +}
> +
>  rtems_task Init(
>    rtems_task_argument argument
>  )
> @@ -57,6 +90,8 @@ rtems_task Init(
>    fatal_directive_status(
>      sc, RTEMS_NOT_OWNER_OF_RESOURCE, "rtems_semaphore_release" );
>
> +  test_create_initially_locked_prio_inherit_sema();
> +
>    TEST_END();
>    rtems_test_exit( 0 );
>  }
> diff --git a/testsuites/sptests/sp51/sp51.doc b/testsuites/sptests/sp51/sp51.doc
> index a1003db..fac5534 100644
> --- a/testsuites/sptests/sp51/sp51.doc
> +++ b/testsuites/sptests/sp51/sp51.doc
> @@ -23,3 +23,6 @@ concepts:
>
>  + Ensure the when the binary semaphore lock fails to acquire the mutex,
>    it is an error to release it since the lock failed.
> +
> ++ Verify that creation of an initially locked priority inheritance mutex does
> +  not change the priority of the executing thread.
> --
> 1.8.4.5
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list