summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2004-02-26 17:04:27 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2004-02-26 17:04:27 +0000
commit9a93d54070b4a2b4f0e0bf18356fc07ae6636203 (patch)
treedf28ee2f3198cfde884b6f374f073748f68dcd6a /cpukit/rtems
parent2004-02-26 Joel Sherrill <joel@OARcorp.com> (diff)
downloadrtems-9a93d54070b4a2b4f0e0bf18356fc07ae6636203.tar.bz2
2004-02-26 Thomas Rauscher <trauscher@loytec.com.
PR 584/RTEMS * src/eventtimeout.c: Fix critical section window.
Diffstat (limited to 'cpukit/rtems')
-rw-r--r--cpukit/rtems/ChangeLog5
-rw-r--r--cpukit/rtems/src/eventtimeout.c30
2 files changed, 26 insertions, 9 deletions
diff --git a/cpukit/rtems/ChangeLog b/cpukit/rtems/ChangeLog
index 7350b1bf68..8bf12f9df9 100644
--- a/cpukit/rtems/ChangeLog
+++ b/cpukit/rtems/ChangeLog
@@ -1,3 +1,8 @@
+2004-02-26 Thomas Rauscher <trauscher@loytec.com.
+
+ PR 584/RTEMS
+ * src/eventtimeout.c: Fix critical section window.
+
2003-10-22 Joel Sherrill <joel@OARcorp.com>
PR 512/core
diff --git a/cpukit/rtems/src/eventtimeout.c b/cpukit/rtems/src/eventtimeout.c
index 027ce3d981..03b6430fb4 100644
--- a/cpukit/rtems/src/eventtimeout.c
+++ b/cpukit/rtems/src/eventtimeout.c
@@ -39,8 +39,9 @@ void _Event_Timeout(
void *ignored
)
{
- Thread_Control *the_thread;
- Objects_Locations location;
+ Thread_Control *the_thread;
+ Objects_Locations location;
+ ISR_Level level;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
@@ -61,14 +62,25 @@ void _Event_Timeout(
* a timeout is not allowed to occur.
*/
- if ( _Event_Sync_state != EVENT_SYNC_SYNCHRONIZED &&
- _Thread_Is_executing( the_thread ) ) {
- if ( _Event_Sync_state != EVENT_SYNC_SATISFIED )
- _Event_Sync_state = EVENT_SYNC_TIMEOUT;
- } else {
- the_thread->Wait.return_code = RTEMS_TIMEOUT;
- _Thread_Unblock( the_thread );
+ _ISR_Disable( level );
+ if ( the_thread->Wait.count ) { /* verify thread is waiting */
+ the_thread->Wait.count = 0;
+ if ( _Event_Sync_state != EVENT_SYNC_SYNCHRONIZED &&
+ _Thread_Is_executing( the_thread ) ) {
+ if ( _Event_Sync_state != EVENT_SYNC_SATISFIED ) {
+ _Event_Sync_state = EVENT_SYNC_TIMEOUT;
+ }
+ _ISR_Enable( level );
+ } else {
+ the_thread->Wait.return_code = RTEMS_TIMEOUT;
+ _ISR_Enable( level );
+ _Thread_Unblock( the_thread );
+ }
}
+ else {
+ _ISR_Enable( level );
+ }
+
_Thread_Unnest_dispatch();
break;
}