summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/semrelease.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-05-01 20:52:51 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-05-19 12:00:46 +0200
commite76c517d0726f91447e0e2c3ba14c00896456e89 (patch)
treecaa429239407c3cfa4cfd8a4e68aae25e893ca35 /cpukit/rtems/src/semrelease.c
parentscore: Fine grained locking for message queues (diff)
downloadrtems-e76c517d0726f91447e0e2c3ba14c00896456e89.tar.bz2
score: Fine grained locking for semaphores
Update #2273.
Diffstat (limited to 'cpukit/rtems/src/semrelease.c')
-rw-r--r--cpukit/rtems/src/semrelease.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/cpukit/rtems/src/semrelease.c b/cpukit/rtems/src/semrelease.c
index 37a05b2507..1f0581eec1 100644
--- a/cpukit/rtems/src/semrelease.c
+++ b/cpukit/rtems/src/semrelease.c
@@ -62,37 +62,46 @@ rtems_status_code rtems_semaphore_release(
CORE_mutex_Status mutex_status;
CORE_semaphore_Status semaphore_status;
rtems_attribute attribute_set;
+ ISR_lock_Context lock_context;
- the_semaphore = _Semaphore_Get( id, &location );
+ the_semaphore = _Semaphore_Get_interrupt_disable(
+ id,
+ &location,
+ &lock_context
+ );
switch ( location ) {
case OBJECTS_LOCAL:
attribute_set = the_semaphore->attribute_set;
#if defined(RTEMS_SMP)
if ( _Attributes_Is_multiprocessor_resource_sharing( attribute_set ) ) {
+ _Thread_Disable_dispatch();
+ _ISR_lock_ISR_enable( &lock_context );
MRSP_Status mrsp_status = _MRSP_Release(
&the_semaphore->Core_control.mrsp,
_Thread_Get_executing()
);
- _Objects_Put( &the_semaphore->Object );
+ _Thread_Enable_dispatch();
return _Semaphore_Translate_MRSP_status_code( mrsp_status );
} else
#endif
if ( !_Attributes_Is_counting_semaphore( attribute_set ) ) {
+ _Thread_Disable_dispatch();
+ _ISR_lock_ISR_enable( &lock_context );
mutex_status = _CORE_mutex_Surrender(
&the_semaphore->Core_control.mutex,
id,
MUTEX_MP_SUPPORT
);
- _Objects_Put( &the_semaphore->Object );
+ _Thread_Enable_dispatch();
return _Semaphore_Translate_core_mutex_return_code( mutex_status );
} else {
semaphore_status = _CORE_semaphore_Surrender(
&the_semaphore->Core_control.semaphore,
id,
- MUTEX_MP_SUPPORT
+ MUTEX_MP_SUPPORT,
+ &lock_context
);
- _Objects_Put( &the_semaphore->Object );
return
_Semaphore_Translate_core_semaphore_return_code( semaphore_status );
}