score: Delete CORE_mutex_Control::lock

The holder field is enough to determine if a mutex is locked or not.

This leads also to better error status codes in case a
rtems_semaphore_release() is done for a mutex without having the
ownership.
This commit is contained in:
Sebastian Huber
2014-03-27 14:46:31 +01:00
parent b1ce11614b
commit 03e8928753
9 changed files with 18 additions and 36 deletions

View File

@@ -35,14 +35,16 @@ rtems_monitor_sema_canonical(
rtems_sema->Core_control.semaphore.Attributes.maximum_count; rtems_sema->Core_control.semaphore.Attributes.maximum_count;
} }
else { else {
/* we have a binary semaphore (mutex) */
Thread_Control *holder = rtems_sema->Core_control.mutex.holder; Thread_Control *holder = rtems_sema->Core_control.mutex.holder;
if (holder != NULL) { if (holder != NULL) {
canonical_sema->holder_id = holder->Object.id; canonical_sema->holder_id = holder->Object.id;
canonical_sema->cur_count = 0;
} else {
canonical_sema->cur_count = 1;
} }
/* we have a binary semaphore (mutex) */
canonical_sema->cur_count = rtems_sema->Core_control.mutex.lock;
canonical_sema->max_count = 1; /* mutex is either 0 or 1 */ canonical_sema->max_count = 1; /* mutex is either 0 or 1 */
} }
} }

View File

@@ -172,12 +172,7 @@ int pthread_mutex_init(
/* /*
* Must be initialized to unlocked. * Must be initialized to unlocked.
*/ */
_CORE_mutex_Initialize( _CORE_mutex_Initialize( &the_mutex->Mutex, NULL, the_mutex_attr, false );
&the_mutex->Mutex,
NULL,
the_mutex_attr,
CORE_MUTEX_UNLOCKED
);
_Objects_Open_u32( &_POSIX_Mutex_Information, &the_mutex->Object, 0 ); _Objects_Open_u32( &_POSIX_Mutex_Information, &the_mutex->Object, 0 );

View File

@@ -179,7 +179,7 @@ rtems_status_code rtems_semaphore_create(
&the_semaphore->Core_control.mutex, &the_semaphore->Core_control.mutex,
_Thread_Get_executing(), _Thread_Get_executing(),
&the_mutex_attr, &the_mutex_attr,
(count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED count != 1
); );
if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) { if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {

View File

@@ -155,9 +155,6 @@ typedef struct {
* behavior. * behavior.
*/ */
CORE_mutex_Attributes Attributes; CORE_mutex_Attributes Attributes;
/** This element contains the current state of the mutex.
*/
uint32_t lock;
/** This element contains the number of times the mutex has been acquired /** This element contains the number of times the mutex has been acquired
* nested. This must be zero (0) before the mutex is actually unlocked. * nested. This must be zero (0) before the mutex is actually unlocked.
*/ */

View File

@@ -98,16 +98,6 @@ typedef enum {
*/ */
#define CORE_MUTEX_STATUS_LAST CORE_MUTEX_STATUS_CEILING_VIOLATED #define CORE_MUTEX_STATUS_LAST CORE_MUTEX_STATUS_CEILING_VIOLATED
/**
* This is the value of a mutex when it is unlocked.
*/
#define CORE_MUTEX_UNLOCKED 1
/**
* This is the value of a mutex when it is locked.
*/
#define CORE_MUTEX_LOCKED 0
/** /**
* @brief Initializes the mutex based on the parameters passed. * @brief Initializes the mutex based on the parameters passed.
* *
@@ -117,7 +107,8 @@ typedef enum {
* @param[in,out] executing The currently executing thread. * @param[in,out] executing The currently executing thread.
* @param[in] the_mutex_attributes is the attributes associated with this * @param[in] the_mutex_attributes is the attributes associated with this
* mutex instance * mutex instance
* @param[in] initial_lock is the initial value of the mutex * @param[in] initially_locked If true, then the mutex is initially locked by
* the executing thread.
* *
* @retval This method returns CORE_MUTEX_STATUS_SUCCESSFUL if successful. * @retval This method returns CORE_MUTEX_STATUS_SUCCESSFUL if successful.
*/ */
@@ -125,7 +116,7 @@ CORE_mutex_Status _CORE_mutex_Initialize(
CORE_mutex_Control *the_mutex, CORE_mutex_Control *the_mutex,
Thread_Control *executing, Thread_Control *executing,
const CORE_mutex_Attributes *the_mutex_attributes, const CORE_mutex_Attributes *the_mutex_attributes,
uint32_t initial_lock bool initially_locked
); );
/** /**
@@ -357,7 +348,7 @@ RTEMS_INLINE_ROUTINE bool _CORE_mutex_Is_locked(
CORE_mutex_Control *the_mutex CORE_mutex_Control *the_mutex
) )
{ {
return the_mutex->lock == CORE_MUTEX_LOCKED; return the_mutex->holder != NULL;
} }
/** /**
@@ -452,7 +443,6 @@ RTEMS_INLINE_ROUTINE int _CORE_mutex_Seize_interrupt_trylock_body(
executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL;
if ( !_CORE_mutex_Is_locked( the_mutex ) ) { if ( !_CORE_mutex_Is_locked( the_mutex ) ) {
the_mutex->lock = CORE_MUTEX_LOCKED;
the_mutex->holder = executing; the_mutex->holder = executing;
the_mutex->nest_count = 1; the_mutex->nest_count = 1;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||
@@ -499,7 +489,7 @@ RTEMS_INLINE_ROUTINE int _CORE_mutex_Seize_interrupt_trylock_body(
} }
/* if ( current < ceiling ) */ { /* if ( current < ceiling ) */ {
executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED;
the_mutex->lock = CORE_MUTEX_UNLOCKED; the_mutex->holder = NULL;
the_mutex->nest_count = 0; /* undo locking above */ the_mutex->nest_count = 0; /* undo locking above */
executing->resource_count--; /* undo locking above */ executing->resource_count--; /* undo locking above */
_ISR_Enable( level ); _ISR_Enable( level );

View File

@@ -61,7 +61,7 @@ void _API_Mutex_Allocate(
mutex = (API_Mutex_Control *) mutex = (API_Mutex_Control *)
_Objects_Allocate_unprotected( &_API_Mutex_Information ); _Objects_Allocate_unprotected( &_API_Mutex_Information );
_CORE_mutex_Initialize( &mutex->Mutex, NULL, &attr, CORE_MUTEX_UNLOCKED ); _CORE_mutex_Initialize( &mutex->Mutex, NULL, &attr, false );
_Objects_Open_u32( &_API_Mutex_Information, &mutex->Object, 1 ); _Objects_Open_u32( &_API_Mutex_Information, &mutex->Object, 1 );

View File

@@ -27,7 +27,7 @@ CORE_mutex_Status _CORE_mutex_Initialize(
CORE_mutex_Control *the_mutex, CORE_mutex_Control *the_mutex,
Thread_Control *executing, Thread_Control *executing,
const CORE_mutex_Attributes *the_mutex_attributes, const CORE_mutex_Attributes *the_mutex_attributes,
uint32_t initial_lock bool initially_locked
) )
{ {
@@ -37,9 +37,8 @@ CORE_mutex_Status _CORE_mutex_Initialize(
*/ */
the_mutex->Attributes = *the_mutex_attributes; the_mutex->Attributes = *the_mutex_attributes;
the_mutex->lock = initial_lock;
if ( initial_lock == CORE_MUTEX_LOCKED ) { if ( initially_locked ) {
the_mutex->nest_count = 1; the_mutex->nest_count = 1;
the_mutex->holder = executing; the_mutex->holder = executing;
if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ||

View File

@@ -217,8 +217,7 @@ CORE_mutex_Status _CORE_mutex_Surrender(
break; break;
} }
} }
} else }
the_mutex->lock = CORE_MUTEX_UNLOCKED;
return CORE_MUTEX_STATUS_SUCCESSFUL; return CORE_MUTEX_STATUS_SUCCESSFUL;
} }

View File

@@ -52,10 +52,10 @@ rtems_task Init(
fatal_directive_status( fatal_directive_status(
sc, RTEMS_INVALID_PRIORITY, "rtems_semaphore_obtain" ); sc, RTEMS_INVALID_PRIORITY, "rtems_semaphore_obtain" );
/* This returns successful because RTEMS eats the unneeded unlock */
puts( "Release semaphore we did not obtain" ); puts( "Release semaphore we did not obtain" );
sc = rtems_semaphore_release( mutex ); sc = rtems_semaphore_release( mutex );
directive_failed( sc, "rtems_semaphore_release" ); fatal_directive_status(
sc, RTEMS_NOT_OWNER_OF_RESOURCE, "rtems_semaphore_release" );
TEST_END(); TEST_END();
rtems_test_exit( 0 ); rtems_test_exit( 0 );