summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2004-07-24 17:52:40 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2004-07-24 17:52:40 +0000
commit0ca88a1dd42fb4df94f54b326ba19ccc84574795 (patch)
treee5bbc5fe5b2a86f5028e87049b017ec1b8b99419
parent2004-07-24 Joel Sherrill <joel@OARcorp.com> (diff)
downloadrtems-0ca88a1dd42fb4df94f54b326ba19ccc84574795.tar.bz2
2004-07-24 Mick Davis <mickd@microsol.iinet.net.au>
PR 641/rtems * src/eventsurrender.c: The problem here is that events may be lost when sent to a task which enters rtems_event_receive() with options set to wait with a timeout and to return on receipt of any event. The events are sent from an interrupt source such as a timer service routine. If more than one set of events is sent to the task before it returns, the first event set may be overwritten.
-rw-r--r--cpukit/rtems/ChangeLog10
-rw-r--r--cpukit/rtems/src/eventsurrender.c1
2 files changed, 11 insertions, 0 deletions
diff --git a/cpukit/rtems/ChangeLog b/cpukit/rtems/ChangeLog
index 241fed912c..2f84ccdee6 100644
--- a/cpukit/rtems/ChangeLog
+++ b/cpukit/rtems/ChangeLog
@@ -1,3 +1,13 @@
+2004-07-24 Mick Davis <mickd@microsol.iinet.net.au>
+
+ PR 641/rtems
+ * src/eventsurrender.c: The problem here is that events may be lost
+ when sent to a task which enters rtems_event_receive() with options
+ set to wait with a timeout and to return on receipt of any event. The
+ events are sent from an interrupt source such as a timer service
+ routine. If more than one set of events is sent to the task before it
+ returns, the first event set may be overwritten.
+
2004-07-24 Joel Sherrill <joel@OARcorp.com>
PR 652/rtems
diff --git a/cpukit/rtems/src/eventsurrender.c b/cpukit/rtems/src/eventsurrender.c
index 0af3a3b0c9..ffe3c1752b 100644
--- a/cpukit/rtems/src/eventsurrender.c
+++ b/cpukit/rtems/src/eventsurrender.c
@@ -96,6 +96,7 @@ void _Event_Surrender(
if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
api->pending_events =
_Event_sets_Clear( pending_events,seized_events );
+ (rtems_event_set) the_thread->Wait.count = 0;
*(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
_Event_Sync_state = EVENT_SYNC_SATISFIED;
}