mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-26 22:48:23 +00:00
Added maximum count detection logic.
This commit is contained in:
@@ -55,7 +55,8 @@ typedef enum {
|
||||
CORE_SEMAPHORE_STATUS_SUCCESSFUL,
|
||||
CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT,
|
||||
CORE_SEMAPHORE_WAS_DELETED,
|
||||
CORE_SEMAPHORE_TIMEOUT
|
||||
CORE_SEMAPHORE_TIMEOUT,
|
||||
CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED
|
||||
} CORE_semaphore_Status;
|
||||
|
||||
/*
|
||||
@@ -64,6 +65,7 @@ typedef enum {
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
unsigned32 maximum_count;
|
||||
CORE_semaphore_Disciplines discipline;
|
||||
} CORE_semaphore_Attributes;
|
||||
|
||||
|
||||
@@ -91,16 +91,26 @@ CORE_semaphore_Status _CORE_semaphore_Surrender(
|
||||
)
|
||||
{
|
||||
Thread_Control *the_thread;
|
||||
ISR_Level level;
|
||||
CORE_semaphore_Status status;
|
||||
|
||||
status = CORE_SEMAPHORE_STATUS_SUCCESSFUL;
|
||||
|
||||
if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) {
|
||||
|
||||
if ( !_Objects_Is_local_id( the_thread->Object.id ) )
|
||||
(*api_semaphore_mp_support) ( the_thread, id );
|
||||
|
||||
} else
|
||||
the_semaphore->count += 1;
|
||||
} else {
|
||||
_ISR_Disable( level );
|
||||
if ( the_semaphore->count <= the_semaphore->Attributes.maximum_count )
|
||||
the_semaphore->count += 1;
|
||||
else
|
||||
status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED;
|
||||
_ISR_Enable( level );
|
||||
}
|
||||
|
||||
return( CORE_SEMAPHORE_STATUS_SUCCESSFUL );
|
||||
return status;
|
||||
}
|
||||
|
||||
/*PAGE
|
||||
|
||||
Reference in New Issue
Block a user