summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/systemeventreceive.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-03-04 08:02:19 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-03-05 11:36:45 +0100
commit7d6e94b12ab94f13d3e769702d50f91be7d5884b (patch)
tree2e2db2c1bb80c1f287f2c4c25f819ffa8b958704 /cpukit/rtems/src/systemeventreceive.c
parentscore: Add thread wait flags (diff)
downloadrtems-7d6e94b12ab94f13d3e769702d50f91be7d5884b.tar.bz2
score: Implement fine-grained locking for events
Use the ISR lock of the thread object to protect the event state and use the Giant lock only for the blocking operations. Update #2273.
Diffstat (limited to 'cpukit/rtems/src/systemeventreceive.c')
-rw-r--r--cpukit/rtems/src/systemeventreceive.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/cpukit/rtems/src/systemeventreceive.c b/cpukit/rtems/src/systemeventreceive.c
index c24e19a8ef..394b26e0a8 100644
--- a/cpukit/rtems/src/systemeventreceive.c
+++ b/cpukit/rtems/src/systemeventreceive.c
@@ -27,7 +27,7 @@
#include <rtems/rtems/eventimpl.h>
#include <rtems/rtems/tasks.h>
#include <rtems/score/statesimpl.h>
-#include <rtems/score/threaddispatch.h>
+#include <rtems/score/threadimpl.h>
rtems_status_code rtems_event_system_receive(
rtems_event_set event_in,
@@ -39,12 +39,12 @@ rtems_status_code rtems_event_system_receive(
rtems_status_code sc;
if ( event_out != NULL ) {
- Thread_Control *executing = _Thread_Get_executing();
+ ISR_lock_Context lock_context;
+ Thread_Control *executing = _Thread_Acquire_executing( &lock_context );
RTEMS_API_Control *api = executing->API_Extensions[ THREAD_API_RTEMS ];
Event_Control *event = &api->System_event;
if ( !_Event_sets_Is_empty( event_in ) ) {
- _Thread_Disable_dispatch();
_Event_Seize(
event_in,
option_set,
@@ -52,14 +52,15 @@ rtems_status_code rtems_event_system_receive(
event_out,
executing,
event,
- &_System_event_Sync_state,
- STATES_WAITING_FOR_SYSTEM_EVENT
+ THREAD_WAIT_CLASS_SYSTEM_EVENT,
+ STATES_WAITING_FOR_SYSTEM_EVENT,
+ &lock_context
);
- _Thread_Enable_dispatch();
sc = executing->Wait.return_code;
} else {
*event_out = event->pending_events;
+ _Objects_Release_and_ISR_enable( &executing->Object, &lock_context );
sc = RTEMS_SUCCESSFUL;
}
} else {