mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-11-15 11:10:11 +08:00
2008-01-22 Joel Sherrill <joel.sherrill@OARcorp.com>
* rtems/src/eventsurrender.c, rtems/src/ratemonperiod.c, score/src/threadqdequeue.c, score/src/threadqdequeuefifo.c, score/src/threadqdequeuepriority.c: Fix bugs encountered while testing and clean up more code.
This commit is contained in:
1 parent
4e1304dcb9
commit
11c16a64f6
6 files changed
+31
-30
No files matched your search
@@ -1,3 +1,10 @@
|
||||
2008-01-22 Joel Sherrill <joel.sherrill@OARcorp.com>
|
||||
|
||||
* rtems/src/eventsurrender.c, rtems/src/ratemonperiod.c,
|
||||
score/src/threadqdequeue.c, score/src/threadqdequeuefifo.c,
|
||||
score/src/threadqdequeuepriority.c: Fix bugs encountered while
|
||||
testing and clean up more code.
|
||||
|
||||
2008-01-22 Joel Sherrill <joel.sherrill@oarcorp.com>
|
||||
|
||||
* score/src/threadqfirst.c: Remove switch.
|
||||
|
||||
@@ -66,8 +66,10 @@ void _Event_Surrender(
|
||||
/*
|
||||
* No events were seized in this operation
|
||||
*/
|
||||
if ( _Event_sets_Is_empty( seized_events ) )
|
||||
if ( _Event_sets_Is_empty( seized_events ) ) {
|
||||
_ISR_Enable( level );
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we are in an ISR and sending to the current thread, then
|
||||
|
||||
@@ -197,6 +197,7 @@ rtems_status_code rtems_rate_monotonic_period(
|
||||
return_value = RTEMS_NOT_DEFINED;
|
||||
break;
|
||||
case RATE_MONOTONIC_EXPIRED:
|
||||
case RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING:
|
||||
return_value = RTEMS_TIMEOUT;
|
||||
break;
|
||||
case RATE_MONOTONIC_ACTIVE:
|
||||
|
||||
@@ -48,11 +48,25 @@ Thread_Control *_Thread_queue_Dequeue(
|
||||
)
|
||||
{
|
||||
Thread_Control *(*dequeue_p)( Thread_queue_Control * );
|
||||
Thread_Control *the_thread;
|
||||
ISR_Level level;
|
||||
Thread_blocking_operation_States sync_state;
|
||||
|
||||
if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY )
|
||||
dequeue_p = _Thread_queue_Dequeue_priority;
|
||||
else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */
|
||||
dequeue_p = _Thread_queue_Dequeue_fifo;
|
||||
|
||||
return (*dequeue_p)( the_thread_queue );
|
||||
the_thread = (*dequeue_p)( the_thread_queue );
|
||||
_ISR_Disable( level );
|
||||
if ( !the_thread ) {
|
||||
sync_state = the_thread_queue->sync_state;
|
||||
if ( (sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) ||
|
||||
(sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) ) {
|
||||
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
|
||||
the_thread = _Thread_Executing;
|
||||
}
|
||||
}
|
||||
_ISR_Enable( level );
|
||||
return the_thread;
|
||||
}
|
||||
@@ -74,17 +74,6 @@ Thread_Control *_Thread_queue_Dequeue_fifo(
|
||||
return the_thread;
|
||||
}
|
||||
|
||||
switch ( the_thread_queue->sync_state ) {
|
||||
case THREAD_BLOCKING_OPERATION_SYNCHRONIZED:
|
||||
case THREAD_BLOCKING_OPERATION_SATISFIED:
|
||||
_ISR_Enable( level );
|
||||
return NULL;
|
||||
|
||||
case THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED:
|
||||
case THREAD_BLOCKING_OPERATION_TIMEOUT:
|
||||
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
|
||||
_ISR_Enable( level );
|
||||
return _Thread_Executing;
|
||||
}
|
||||
return NULL; /* this is only to prevent warnings */
|
||||
_ISR_Enable( level );
|
||||
return NULL;
|
||||
}
|
||||
@@ -55,7 +55,6 @@ Thread_Control *_Thread_queue_Dequeue_priority(
|
||||
Chain_Node *last_node;
|
||||
Chain_Node *next_node;
|
||||
Chain_Node *previous_node;
|
||||
Thread_blocking_operation_States sync;
|
||||
|
||||
_ISR_Disable( level );
|
||||
for( index=0 ;
|
||||
@@ -69,21 +68,10 @@ Thread_Control *_Thread_queue_Dequeue_priority(
|
||||
}
|
||||
|
||||
/*
|
||||
* If we interrupted a blocking operation, cancel it.
|
||||
* We did not find a thread to unblock.
|
||||
*/
|
||||
sync = the_thread_queue->sync_state;
|
||||
if ( (sync == THREAD_BLOCKING_OPERATION_SYNCHRONIZED) ||
|
||||
(sync == THREAD_BLOCKING_OPERATION_SATISFIED) ) {
|
||||
_ISR_Enable( level );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ( (sync == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) ||
|
||||
(sync == THREAD_BLOCKING_OPERATION_TIMEOUT ) ) {
|
||||
the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SATISFIED;
|
||||
_ISR_Enable( level );
|
||||
return _Thread_Executing;
|
||||
}
|
||||
_ISR_Enable( level );
|
||||
return NULL;
|
||||
|
||||
dequeue:
|
||||
the_thread->Wait.queue = NULL;
|
||||
|
||||
Reference in new issue
Block a user