Added maximum count detection logic.

This commit is contained in:
Joel Sherrill
1999-11-02 15:58:09 +00:00
parent 9693fdac75
commit 8f0529f65a
4 changed files with 32 additions and 8 deletions

View File

@@ -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;

View File

@@ -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