diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-26 21:18:52 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-02 07:46:14 +0200 |
commit | 7580995b477dab82163e17e021894f5d982e314f (patch) | |
tree | 562047285cc416cca278d00976765a5e04f6c612 /cpukit/rtems/src/msgqdelete.c | |
parent | posix: Delete POSIX_Message_queue_Control::named (diff) | |
download | rtems-7580995b477dab82163e17e021894f5d982e314f.tar.bz2 |
score: _CORE_message_queue_Close()
Move lock acquire to caller of _CORE_message_queue_Close() to allow
state checks during object close operations under lock protection.
Ensures deletion safety on uni-processor configuration.
Diffstat (limited to 'cpukit/rtems/src/msgqdelete.c')
-rw-r--r-- | cpukit/rtems/src/msgqdelete.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/cpukit/rtems/src/msgqdelete.c b/cpukit/rtems/src/msgqdelete.c index 5adeab70e0..506c069704 100644 --- a/cpukit/rtems/src/msgqdelete.c +++ b/cpukit/rtems/src/msgqdelete.c @@ -18,17 +18,8 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/score/chain.h> -#include <rtems/score/isr.h> -#include <rtems/score/coremsgimpl.h> -#include <rtems/score/thread.h> -#include <rtems/score/wkspace.h> -#include <rtems/rtems/status.h> -#include <rtems/rtems/attrimpl.h> #include <rtems/rtems/messageimpl.h> -#include <rtems/rtems/options.h> -#include <rtems/rtems/support.h> +#include <rtems/rtems/attrimpl.h> rtems_status_code rtems_message_queue_delete( rtems_id id @@ -36,19 +27,30 @@ rtems_status_code rtems_message_queue_delete( { Message_queue_Control *the_message_queue; Objects_Locations location; + ISR_lock_Context lock_context; _Objects_Allocator_lock(); - the_message_queue = _Message_queue_Get( id, &location ); + the_message_queue = _Message_queue_Get_interrupt_disable( + id, + &location, + &lock_context + ); switch ( location ) { case OBJECTS_LOCAL: + _CORE_message_queue_Acquire_critical( + &the_message_queue->message_queue, + &lock_context + ); + _Objects_Close( &_Message_queue_Information, &the_message_queue->Object ); _CORE_message_queue_Close( &the_message_queue->message_queue, _Message_queue_MP_Send_object_was_deleted, - id + id, + &lock_context ); #if defined(RTEMS_MULTIPROCESSING) @@ -66,7 +68,6 @@ rtems_status_code rtems_message_queue_delete( ); } #endif - _Objects_Put( &the_message_queue->Object ); _Message_queue_Free( the_message_queue ); _Objects_Allocator_unlock(); return RTEMS_SUCCESSFUL; |