summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/msgqdelete.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-26 21:18:52 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-02 07:46:14 +0200
commit7580995b477dab82163e17e021894f5d982e314f (patch)
tree562047285cc416cca278d00976765a5e04f6c612 /cpukit/rtems/src/msgqdelete.c
parentposix: Delete POSIX_Message_queue_Control::named (diff)
downloadrtems-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.c27
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;