From 7d6e94b12ab94f13d3e769702d50f91be7d5884b Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 4 Mar 2015 08:02:19 +0100 Subject: 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. --- cpukit/rtems/src/eventreceive.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'cpukit/rtems/src/eventreceive.c') 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 #include #include -#include +#include 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 { -- cgit v1.2.3