forked from Imagelibrary/rtems
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:
@@ -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 */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|
||||||
|
|||||||
@@ -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 ) {
|
||||||
|
|||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|
||||||
|
|||||||
@@ -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 ) ||
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|||||||
Reference in New Issue
Block a user