diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-03-04 08:02:19 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-03-05 11:36:45 +0100 |
commit | 7d6e94b12ab94f13d3e769702d50f91be7d5884b (patch) | |
tree | 2e2db2c1bb80c1f287f2c4c25f819ffa8b958704 /cpukit/rtems/src/eventreceive.c | |
parent | 4c8a0acc3dd536b3a5684ced8df663931081ba09 (diff) |
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 '')
-rw-r--r-- | cpukit/rtems/src/eventreceive.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/cpukit/rtems/src/eventreceive.c b/cpukit/rtems/src/eventreceive.c index 49fdb2a9c0..07e1c574df 100644 --- a/cpukit/rtems/src/eventreceive.c +++ b/cpukit/rtems/src/eventreceive.c @@ -21,7 +21,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_receive( rtems_event_set event_in, @@ -33,12 +33,12 @@ rtems_status_code rtems_event_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->Event; if ( !_Event_sets_Is_empty( event_in ) ) { - _Thread_Disable_dispatch(); _Event_Seize( event_in, option_set, @@ -46,14 +46,15 @@ rtems_status_code rtems_event_receive( event_out, executing, event, - &_Event_Sync_state, - STATES_WAITING_FOR_EVENT + THREAD_WAIT_CLASS_EVENT, + STATES_WAITING_FOR_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 { |