[PATCH] score: Unify CORE mutex seize/surrender
Gedare Bloom
gedare at rtems.org
Tue Sep 27 14:59:44 UTC 2016
OK. A mostly unrelated question: why do we have two different
_Semaphore_Get functions, one static in score/src/semaphore.c and the
other inlined from semimpl.h?
On Tue, Sep 27, 2016 at 9:25 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> Use the Thread_Control::resource_count for the no protocol mutexes.
> Merge the no protocol and priority inherit CORE mutex seize/surrender
> operations.
> ---
> cpukit/libnetworking/rtems/rtems_glue.c | 2 +
> cpukit/posix/src/mutexlocksupp.c | 3 +-
> cpukit/posix/src/mutexunlock.c | 3 +-
> cpukit/rtems/src/semobtain.c | 3 +-
> cpukit/rtems/src/semrelease.c | 4 +-
> cpukit/score/include/rtems/score/coremuteximpl.h | 93 ++----------------------
> cpukit/score/src/apimutexlock.c | 1 +
> cpukit/score/src/apimutexunlock.c | 1 +
> 8 files changed, 18 insertions(+), 92 deletions(-)
>
> diff --git a/cpukit/libnetworking/rtems/rtems_glue.c b/cpukit/libnetworking/rtems/rtems_glue.c
> index 9a7f82f..46f8765 100644
> --- a/cpukit/libnetworking/rtems/rtems_glue.c
> +++ b/cpukit/libnetworking/rtems/rtems_glue.c
> @@ -379,6 +379,7 @@ rtems_bsdnet_semaphore_obtain (void)
> _Thread_queue_Context_set_no_timeout( &queue_context );
> status = _CORE_recursive_mutex_Seize (
> &the_networkSemaphore->Core_control.Mutex.Recursive,
> + CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
> _Thread_Executing,
> true, /* wait */
> _CORE_recursive_mutex_Seize_nested,
> @@ -412,6 +413,7 @@ rtems_bsdnet_semaphore_release (void)
> _ISR_lock_ISR_disable(&queue_context.Lock_context.Lock_context);
> status = _CORE_recursive_mutex_Surrender(
> &the_networkSemaphore->Core_control.Mutex.Recursive,
> + CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
> _Thread_Executing,
> &queue_context
> );
> diff --git a/cpukit/posix/src/mutexlocksupp.c b/cpukit/posix/src/mutexlocksupp.c
> index 1da6238..ea4c4e3 100644
> --- a/cpukit/posix/src/mutexlocksupp.c
> +++ b/cpukit/posix/src/mutexlocksupp.c
> @@ -76,7 +76,7 @@ int _POSIX_Mutex_Lock_support(
> );
> break;
> case POSIX_MUTEX_NO_PROTOCOL:
> - status = _CORE_recursive_mutex_Seize_no_protocol(
> + status = _CORE_recursive_mutex_Seize(
> &the_mutex->Mutex.Recursive,
> POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS,
> executing,
> @@ -89,6 +89,7 @@ int _POSIX_Mutex_Lock_support(
> _Assert( the_mutex->protocol == POSIX_MUTEX_PRIORITY_INHERIT );
> status = _CORE_recursive_mutex_Seize(
> &the_mutex->Mutex.Recursive,
> + CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
> executing,
> wait,
> _POSIX_Mutex_Lock_nested,
> diff --git a/cpukit/posix/src/mutexunlock.c b/cpukit/posix/src/mutexunlock.c
> index 3144314..c15f7e6 100644
> --- a/cpukit/posix/src/mutexunlock.c
> +++ b/cpukit/posix/src/mutexunlock.c
> @@ -53,7 +53,7 @@ int pthread_mutex_unlock(
> );
> break;
> case POSIX_MUTEX_NO_PROTOCOL:
> - status = _CORE_recursive_mutex_Surrender_no_protocol(
> + status = _CORE_recursive_mutex_Surrender(
> &the_mutex->Mutex.Recursive,
> POSIX_MUTEX_NO_PROTOCOL_TQ_OPERATIONS,
> executing,
> @@ -64,6 +64,7 @@ int pthread_mutex_unlock(
> _Assert( the_mutex->protocol == POSIX_MUTEX_PRIORITY_INHERIT );
> status = _CORE_recursive_mutex_Surrender(
> &the_mutex->Mutex.Recursive,
> + CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
> executing,
> &queue_context
> );
> diff --git a/cpukit/rtems/src/semobtain.c b/cpukit/rtems/src/semobtain.c
> index 9afef54..b81612e 100644
> --- a/cpukit/rtems/src/semobtain.c
> +++ b/cpukit/rtems/src/semobtain.c
> @@ -75,6 +75,7 @@ rtems_status_code rtems_semaphore_obtain(
> case SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY:
> status = _CORE_recursive_mutex_Seize(
> &the_semaphore->Core_control.Mutex.Recursive,
> + CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
> executing,
> wait,
> _CORE_recursive_mutex_Seize_nested,
> @@ -91,7 +92,7 @@ rtems_status_code rtems_semaphore_obtain(
> );
> break;
> case SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL:
> - status = _CORE_recursive_mutex_Seize_no_protocol(
> + status = _CORE_recursive_mutex_Seize(
> &the_semaphore->Core_control.Mutex.Recursive,
> _Semaphore_Get_operations( the_semaphore ),
> executing,
> diff --git a/cpukit/rtems/src/semrelease.c b/cpukit/rtems/src/semrelease.c
> index 39c467d..40860a1 100644
> --- a/cpukit/rtems/src/semrelease.c
> +++ b/cpukit/rtems/src/semrelease.c
> @@ -52,6 +52,7 @@ rtems_status_code rtems_semaphore_release( rtems_id id )
> case SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY:
> status = _CORE_recursive_mutex_Surrender(
> &the_semaphore->Core_control.Mutex.Recursive,
> + CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
> executing,
> &queue_context
> );
> @@ -64,13 +65,12 @@ rtems_status_code rtems_semaphore_release( rtems_id id )
> );
> break;
> case SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL:
> - _CORE_recursive_mutex_Surrender_no_protocol(
> + status = _CORE_recursive_mutex_Surrender(
> &the_semaphore->Core_control.Mutex.Recursive,
> _Semaphore_Get_operations( the_semaphore ),
> executing,
> &queue_context
> );
> - status = STATUS_SUCCESSFUL;
> break;
> case SEMAPHORE_VARIANT_SIMPLE_BINARY:
> status = _CORE_semaphore_Surrender(
> diff --git a/cpukit/score/include/rtems/score/coremuteximpl.h b/cpukit/score/include/rtems/score/coremuteximpl.h
> index d30e38d..2580606 100644
> --- a/cpukit/score/include/rtems/score/coremuteximpl.h
> +++ b/cpukit/score/include/rtems/score/coremuteximpl.h
> @@ -134,6 +134,7 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Seize_nested(
>
> RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Seize(
> CORE_recursive_mutex_Control *the_mutex,
> + const Thread_queue_Operations *operations,
> Thread_Control *executing,
> bool wait,
> Status_Control ( *nested )( CORE_recursive_mutex_Control * ),
> @@ -163,7 +164,7 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Seize(
>
> return _CORE_mutex_Seize_slow(
> &the_mutex->Mutex,
> - CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
> + operations,
> executing,
> wait,
> queue_context
> @@ -171,9 +172,10 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Seize(
> }
>
> RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Surrender(
> - CORE_recursive_mutex_Control *the_mutex,
> - Thread_Control *executing,
> - Thread_queue_Context *queue_context
> + CORE_recursive_mutex_Control *the_mutex,
> + const Thread_queue_Operations *operations,
> + Thread_Control *executing,
> + Thread_queue_Context *queue_context
> )
> {
> unsigned int nest_level;
> @@ -209,91 +211,8 @@ RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Surrender(
> heads,
> executing,
> queue_context,
> - CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS
> - );
> - return STATUS_SUCCESSFUL;
> -}
> -
> -RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Seize_no_protocol(
> - CORE_recursive_mutex_Control *the_mutex,
> - const Thread_queue_Operations *operations,
> - Thread_Control *executing,
> - bool wait,
> - Status_Control ( *nested )( CORE_recursive_mutex_Control * ),
> - Thread_queue_Context *queue_context
> -)
> -{
> - Thread_Control *owner;
> -
> - _CORE_mutex_Acquire_critical( &the_mutex->Mutex, queue_context );
> -
> - owner = _CORE_mutex_Get_owner( &the_mutex->Mutex );
> -
> - if ( owner == NULL ) {
> - _CORE_mutex_Set_owner( &the_mutex->Mutex, executing );
> - _CORE_mutex_Release( &the_mutex->Mutex, queue_context );
> - return STATUS_SUCCESSFUL;
> - }
> -
> - if ( owner == executing ) {
> - Status_Control status;
> -
> - status = ( *nested )( the_mutex );
> - _CORE_mutex_Release( &the_mutex->Mutex, queue_context );
> - return status;
> - }
> -
> - return _CORE_mutex_Seize_slow(
> - &the_mutex->Mutex,
> - operations,
> - executing,
> - wait,
> - queue_context
> - );
> -}
> -
> -RTEMS_INLINE_ROUTINE Status_Control _CORE_recursive_mutex_Surrender_no_protocol(
> - CORE_recursive_mutex_Control *the_mutex,
> - const Thread_queue_Operations *operations,
> - Thread_Control *executing,
> - Thread_queue_Context *queue_context
> -)
> -{
> - unsigned int nest_level;
> - Thread_Control *new_owner;
> -
> - _CORE_mutex_Acquire_critical( &the_mutex->Mutex, queue_context );
> -
> - if ( !_CORE_mutex_Is_owner( &the_mutex->Mutex, executing ) ) {
> - _CORE_mutex_Release( &the_mutex->Mutex, queue_context );
> - return STATUS_NOT_OWNER;
> - }
> -
> - nest_level = the_mutex->nest_level;
> -
> - if ( nest_level > 0 ) {
> - the_mutex->nest_level = nest_level - 1;
> - _CORE_mutex_Release( &the_mutex->Mutex, queue_context );
> - return STATUS_SUCCESSFUL;
> - }
> -
> - new_owner = _Thread_queue_First_locked(
> - &the_mutex->Mutex.Wait_queue,
> operations
> );
> - _CORE_mutex_Set_owner( &the_mutex->Mutex, new_owner );
> -
> - if ( new_owner == NULL ) {
> - _CORE_mutex_Release( &the_mutex->Mutex, queue_context );
> - return STATUS_SUCCESSFUL;
> - }
> -
> - _Thread_queue_Extract_critical(
> - &the_mutex->Mutex.Wait_queue.Queue,
> - operations,
> - new_owner,
> - queue_context
> - );
> return STATUS_SUCCESSFUL;
> }
>
> diff --git a/cpukit/score/src/apimutexlock.c b/cpukit/score/src/apimutexlock.c
> index cf90a76..879562d 100644
> --- a/cpukit/score/src/apimutexlock.c
> +++ b/cpukit/score/src/apimutexlock.c
> @@ -36,6 +36,7 @@ void _API_Mutex_Lock( API_Mutex_Control *the_mutex )
> _Thread_queue_Context_set_no_timeout( &queue_context );
> _CORE_recursive_mutex_Seize(
> &the_mutex->Mutex,
> + CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
> _Thread_Executing,
> true,
> _CORE_recursive_mutex_Seize_nested,
> diff --git a/cpukit/score/src/apimutexunlock.c b/cpukit/score/src/apimutexunlock.c
> index f04e47a..e1fe645 100644
> --- a/cpukit/score/src/apimutexunlock.c
> +++ b/cpukit/score/src/apimutexunlock.c
> @@ -35,6 +35,7 @@ void _API_Mutex_Unlock( API_Mutex_Control *the_mutex )
> _ISR_lock_ISR_disable( &queue_context.Lock_context.Lock_context );
> _CORE_recursive_mutex_Surrender(
> &the_mutex->Mutex,
> + CORE_MUTEX_TQ_PRIORITY_INHERIT_OPERATIONS,
> _Thread_Executing,
> &queue_context
> );
> --
> 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