[PATCH 11/15] rtems: _Message_queue_Get_interrupt_disable()
Sebastian Huber
sebastian.huber at embedded-brains.de
Fri May 20 13:33:48 UTC 2016
Use _Objects_Get_local() for _Message_queue_Get_interrupt_disable() to
get rid of the location parameter. Move remote object handling to
message queue MPCI support.
---
cpukit/rtems/include/rtems/rtems/messageimpl.h | 8 +-
cpukit/rtems/include/rtems/rtems/msgmp.h | 69 +++++++++++++---
cpukit/rtems/src/msgmp.c | 110 ++++++++++++++++++++++++-
cpukit/rtems/src/msgqbroadcast.c | 69 +++++-----------
cpukit/rtems/src/msgqdelete.c | 85 +++++++++----------
cpukit/rtems/src/msgqflush.c | 69 +++-------------
cpukit/rtems/src/msgqgetnumberpending.c | 47 ++++-------
cpukit/rtems/src/msgqreceive.c | 88 +++++++-------------
cpukit/rtems/src/msgqsend.c | 85 +++++++------------
cpukit/rtems/src/msgqurgent.c | 83 +++++++------------
10 files changed, 348 insertions(+), 365 deletions(-)
diff --git a/cpukit/rtems/include/rtems/rtems/messageimpl.h b/cpukit/rtems/include/rtems/rtems/messageimpl.h
index 46a4d9e..a40ace3 100644
--- a/cpukit/rtems/include/rtems/rtems/messageimpl.h
+++ b/cpukit/rtems/include/rtems/rtems/messageimpl.h
@@ -104,15 +104,13 @@ RTEMS_INLINE_ROUTINE void _Message_queue_Free (
RTEMS_INLINE_ROUTINE Message_queue_Control *
_Message_queue_Get_interrupt_disable(
Objects_Id id,
- Objects_Locations *location,
ISR_lock_Context *lock_context
)
{
- return (Message_queue_Control *) _Objects_Get_isr_disable(
- &_Message_queue_Information,
+ return (Message_queue_Control *) _Objects_Get_local(
id,
- location,
- lock_context
+ lock_context,
+ &_Message_queue_Information
);
}
diff --git a/cpukit/rtems/include/rtems/rtems/msgmp.h b/cpukit/rtems/include/rtems/rtems/msgmp.h
index 0dc6bc5..3dabd8d 100644
--- a/cpukit/rtems/include/rtems/rtems/msgmp.h
+++ b/cpukit/rtems/include/rtems/rtems/msgmp.h
@@ -79,6 +79,11 @@ typedef struct {
#define MESSAGE_QUEUE_MP_PACKET_SIZE \
offsetof(Message_queue_MP_Packet, Buffer.buffer)
+RTEMS_INLINE_ROUTINE bool _Message_queue_MP_Is_remote( Objects_Id id )
+{
+ return _Objects_MP_Is_remote( id, &_Message_queue_Information );
+}
+
/**
* @brief Message_queue_Core_message_queue_mp_support
*
@@ -107,18 +112,58 @@ void _Message_queue_MP_Send_process_packet (
);
/**
- * @brief _Message_queue_MP_Send_request_packet
- *
- * This routine performs a remote procedure call so that a
- * directive operation can be initiated on another node.
- */
-rtems_status_code _Message_queue_MP_Send_request_packet (
- Message_queue_MP_Remote_operations operation,
- Objects_Id message_queue_id,
- const void *buffer,
- size_t *size_p,
- rtems_option option_set,
- rtems_interval timeout
+ * @brief Issues a remote rtems_message_queue_broadcast() request.
+ */
+rtems_status_code _Message_queue_MP_Broadcast(
+ rtems_id id,
+ const void *buffer,
+ size_t size,
+ uint32_t *count
+);
+
+/**
+ * @brief Issues a remote rtems_message_queue_flush() request.
+ */
+rtems_status_code _Message_queue_MP_Flush(
+ rtems_id id,
+ uint32_t *count
+);
+
+/**
+ * @brief Issues a remote rtems_message_queue_get_number_pending() request.
+ */
+rtems_status_code _Message_queue_MP_Get_number_pending(
+ rtems_id id,
+ uint32_t *count
+);
+
+/**
+ * @brief Issues a remote rtems_message_queue_receive() request.
+ */
+rtems_status_code _Message_queue_MP_Receive(
+ rtems_id id,
+ void *buffer,
+ size_t *size,
+ rtems_option option_set,
+ rtems_interval timeout
+);
+
+/**
+ * @brief Issues a remote rtems_message_queue_send() request.
+ */
+rtems_status_code _Message_queue_MP_Send(
+ rtems_id id,
+ const void *buffer,
+ size_t size
+);
+
+/**
+ * @brief Issues a remote rtems_message_queue_urgent() request.
+ */
+rtems_status_code _Message_queue_MP_Urgent(
+ rtems_id id,
+ const void *buffer,
+ size_t size
);
/**
diff --git a/cpukit/rtems/src/msgmp.c b/cpukit/rtems/src/msgmp.c
index d0ee419..c336ba4 100644
--- a/cpukit/rtems/src/msgmp.c
+++ b/cpukit/rtems/src/msgmp.c
@@ -95,17 +95,21 @@ void _Message_queue_MP_Send_process_packet (
*
*/
-rtems_status_code _Message_queue_MP_Send_request_packet (
- Message_queue_MP_Remote_operations operation,
+static rtems_status_code _Message_queue_MP_Send_request_packet (
Objects_Id message_queue_id,
const void *buffer,
size_t *size_p,
rtems_option option_set,
- rtems_interval timeout
+ rtems_interval timeout,
+ Message_queue_MP_Remote_operations operation
)
{
Message_queue_MP_Packet *the_packet;
+ if ( !_Message_queue_MP_Is_remote( message_queue_id ) ) {
+ return RTEMS_INVALID_ID;
+ }
+
switch ( operation ) {
case MESSAGE_QUEUE_MP_SEND_REQUEST:
@@ -200,6 +204,106 @@ rtems_status_code _Message_queue_MP_Send_request_packet (
return RTEMS_SUCCESSFUL;
}
+rtems_status_code _Message_queue_MP_Broadcast(
+ rtems_id id,
+ const void *buffer,
+ size_t size,
+ uint32_t *count
+)
+{
+ _Thread_Get_executing()->Wait.return_argument = count;
+ return _Message_queue_MP_Send_request_packet(
+ id,
+ buffer,
+ &size,
+ 0,
+ MPCI_DEFAULT_TIMEOUT,
+ MESSAGE_QUEUE_MP_BROADCAST_REQUEST
+ );
+}
+
+rtems_status_code _Message_queue_MP_Flush(
+ rtems_id id,
+ uint32_t *count
+)
+{
+ _Thread_Get_executing()->Wait.return_argument = count;
+ return _Message_queue_MP_Send_request_packet(
+ id,
+ NULL,
+ NULL,
+ 0,
+ MPCI_DEFAULT_TIMEOUT,
+ MESSAGE_QUEUE_MP_FLUSH_REQUEST
+ );
+}
+
+rtems_status_code _Message_queue_MP_Get_number_pending(
+ rtems_id id,
+ uint32_t *count
+)
+{
+ _Thread_Get_executing()->Wait.return_argument = count;
+ return _Message_queue_MP_Send_request_packet(
+ id,
+ NULL,
+ NULL,
+ 0,
+ MPCI_DEFAULT_TIMEOUT,
+ MESSAGE_QUEUE_MP_GET_NUMBER_PENDING_REQUEST
+ );
+}
+
+rtems_status_code _Message_queue_MP_Receive(
+ rtems_id id,
+ void *buffer,
+ size_t *size,
+ rtems_option option_set,
+ rtems_interval timeout
+)
+{
+ return _Message_queue_MP_Send_request_packet(
+ id,
+ buffer,
+ size,
+ option_set,
+ timeout,
+ MESSAGE_QUEUE_MP_RECEIVE_REQUEST
+ );
+}
+
+rtems_status_code _Message_queue_MP_Send(
+ rtems_id id,
+ const void *buffer,
+ size_t size
+)
+{
+ return _Message_queue_MP_Send_request_packet(
+ id,
+ buffer,
+ &size,
+ 0,
+ MPCI_DEFAULT_TIMEOUT,
+ MESSAGE_QUEUE_MP_SEND_REQUEST
+ );
+}
+
+rtems_status_code _Message_queue_MP_Urgent(
+ rtems_id id,
+ const void *buffer,
+ size_t size
+)
+{
+ return _Message_queue_MP_Send_request_packet(
+ id,
+ buffer,
+ &size,
+ 0,
+ MPCI_DEFAULT_TIMEOUT,
+ MESSAGE_QUEUE_MP_URGENT_REQUEST
+ );
+}
+
/*
* _Message_queue_MP_Send_response_packet
*
diff --git a/cpukit/rtems/src/msgqbroadcast.c b/cpukit/rtems/src/msgqbroadcast.c
index 7bd7e3b..5aab1b1 100644
--- a/cpukit/rtems/src/msgqbroadcast.c
+++ b/cpukit/rtems/src/msgqbroadcast.c
@@ -18,17 +18,7 @@
#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>
rtems_status_code rtems_message_queue_broadcast(
rtems_id id,
@@ -37,54 +27,39 @@ rtems_status_code rtems_message_queue_broadcast(
uint32_t *count
)
{
- Message_queue_Control *the_message_queue;
- Objects_Locations location;
- CORE_message_queue_Status core_status;
- ISR_lock_Context lock_context;
+ Message_queue_Control *the_message_queue;
+ ISR_lock_Context lock_context;
+ CORE_message_queue_Status status;
- if ( !buffer )
+ if ( buffer == NULL ) {
return RTEMS_INVALID_ADDRESS;
+ }
- if ( !count )
+ if ( count == NULL ) {
return RTEMS_INVALID_ADDRESS;
+ }
the_message_queue = _Message_queue_Get_interrupt_disable(
id,
- &location,
&lock_context
);
- switch ( location ) {
-
- case OBJECTS_LOCAL:
- core_status = _CORE_message_queue_Broadcast(
- &the_message_queue->message_queue,
- buffer,
- size,
- _Message_queue_Core_message_queue_mp_support,
- id,
- count,
- &lock_context
- );
- return
- _Message_queue_Translate_core_message_queue_return_code( core_status );
+ if ( the_message_queue == NULL ) {
#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE:
- _Thread_Executing->Wait.return_argument = count;
-
- return
- _Message_queue_MP_Send_request_packet(
- MESSAGE_QUEUE_MP_BROADCAST_REQUEST,
- id,
- buffer,
- &size,
- 0, /* option_set not used */
- MPCI_DEFAULT_TIMEOUT
- );
+ _Message_queue_MP_Broadcast( id, buffer, size, count );
+#else
+ return RTEMS_INVALID_ID;
#endif
-
- case OBJECTS_ERROR:
- break;
}
- return RTEMS_INVALID_ID;
+
+ status = _CORE_message_queue_Broadcast(
+ &the_message_queue->message_queue,
+ buffer,
+ size,
+ _Message_queue_Core_message_queue_mp_support,
+ id,
+ count,
+ &lock_context
+ );
+ return _Message_queue_Translate_core_message_queue_return_code( status );
}
diff --git a/cpukit/rtems/src/msgqdelete.c b/cpukit/rtems/src/msgqdelete.c
index 506c069..810b741 100644
--- a/cpukit/rtems/src/msgqdelete.c
+++ b/cpukit/rtems/src/msgqdelete.c
@@ -25,64 +25,55 @@ rtems_status_code rtems_message_queue_delete(
rtems_id id
)
{
- Message_queue_Control *the_message_queue;
- Objects_Locations location;
- ISR_lock_Context lock_context;
+ Message_queue_Control *the_message_queue;
+ ISR_lock_Context lock_context;
_Objects_Allocator_lock();
- the_message_queue = _Message_queue_Get_interrupt_disable(
- id,
- &location,
- &lock_context
- );
- switch ( location ) {
+ the_message_queue = _Message_queue_Get_interrupt_disable( id, &lock_context );
- case OBJECTS_LOCAL:
- _CORE_message_queue_Acquire_critical(
- &the_message_queue->message_queue,
- &lock_context
- );
+ if ( the_message_queue == NULL ) {
+ _Objects_Allocator_unlock();
- _Objects_Close( &_Message_queue_Information,
- &the_message_queue->Object );
+#if defined(RTEMS_MULTIPROCESSING)
+ if ( _Message_queue_MP_Is_remote( id ) ) {
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
+ }
+#endif
- _CORE_message_queue_Close(
- &the_message_queue->message_queue,
- _Message_queue_MP_Send_object_was_deleted,
- id,
- &lock_context
- );
+ return RTEMS_INVALID_ID;
+ }
-#if defined(RTEMS_MULTIPROCESSING)
- if ( _Attributes_Is_global( the_message_queue->attribute_set ) ) {
- _Objects_MP_Close(
- &_Message_queue_Information,
- the_message_queue->Object.id
- );
+ _CORE_message_queue_Acquire_critical(
+ &the_message_queue->message_queue,
+ &lock_context
+ );
- _Message_queue_MP_Send_process_packet(
- MESSAGE_QUEUE_MP_ANNOUNCE_DELETE,
- the_message_queue->Object.id,
- 0, /* Not used */
- 0
- );
- }
-#endif
- _Message_queue_Free( the_message_queue );
- _Objects_Allocator_unlock();
- return RTEMS_SUCCESSFUL;
+ _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,
+ &lock_context
+ );
#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE:
- _Objects_Allocator_unlock();
- return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
-#endif
+ if ( _Attributes_Is_global( the_message_queue->attribute_set ) ) {
+ _Objects_MP_Close(
+ &_Message_queue_Information,
+ the_message_queue->Object.id
+ );
- case OBJECTS_ERROR:
- break;
+ _Message_queue_MP_Send_process_packet(
+ MESSAGE_QUEUE_MP_ANNOUNCE_DELETE,
+ the_message_queue->Object.id,
+ 0, /* Not used */
+ 0
+ );
}
+#endif
+ _Message_queue_Free( the_message_queue );
_Objects_Allocator_unlock();
-
- return RTEMS_INVALID_ID;
+ return RTEMS_SUCCESSFUL;
}
diff --git a/cpukit/rtems/src/msgqflush.c b/cpukit/rtems/src/msgqflush.c
index 809c243..5cd09b6 100644
--- a/cpukit/rtems/src/msgqflush.c
+++ b/cpukit/rtems/src/msgqflush.c
@@ -18,79 +18,36 @@
#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>
-
-/*
- * rtems_message_queue_flush
- *
- * This directive removes all pending messages from a queue and returns
- * the number of messages removed. If no messages were present then
- * a count of zero is returned.
- *
- * Input parameters:
- * id - queue id
- * count - return area for count
- *
- * Output parameters:
- * count - number of messages removed ( 0 = empty queue )
- * RTEMS_SUCCESSFUL - if successful
- * error code - if unsuccessful
- */
rtems_status_code rtems_message_queue_flush(
rtems_id id,
uint32_t *count
)
{
- Message_queue_Control *the_message_queue;
- Objects_Locations location;
- ISR_lock_Context lock_context;
+ Message_queue_Control *the_message_queue;
+ ISR_lock_Context lock_context;
- if ( !count )
+ if ( count == NULL ) {
return RTEMS_INVALID_ADDRESS;
+ }
the_message_queue = _Message_queue_Get_interrupt_disable(
id,
- &location,
&lock_context
);
- switch ( location ) {
-
- case OBJECTS_LOCAL:
- *count = _CORE_message_queue_Flush(
- &the_message_queue->message_queue,
- &lock_context
- );
- return RTEMS_SUCCESSFUL;
+ if ( the_message_queue == NULL ) {
#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE:
- _Thread_Executing->Wait.return_argument = count;
-
- return
- _Message_queue_MP_Send_request_packet(
- MESSAGE_QUEUE_MP_FLUSH_REQUEST,
- id,
- 0, /* buffer not used */
- 0, /* size */
- 0, /* option_set not used */
- MPCI_DEFAULT_TIMEOUT
- );
+ _Message_queue_MP_Flush( id, count );
+#else
+ return RTEMS_INVALID_ID;
#endif
-
- case OBJECTS_ERROR:
- break;
}
- return RTEMS_INVALID_ID;
+ *count = _CORE_message_queue_Flush(
+ &the_message_queue->message_queue,
+ &lock_context
+ );
+ return RTEMS_SUCCESSFUL;
}
diff --git a/cpukit/rtems/src/msgqgetnumberpending.c b/cpukit/rtems/src/msgqgetnumberpending.c
index 756e8fe..6fa0e4f 100644
--- a/cpukit/rtems/src/msgqgetnumberpending.c
+++ b/cpukit/rtems/src/msgqgetnumberpending.c
@@ -26,48 +26,33 @@ rtems_status_code rtems_message_queue_get_number_pending(
)
{
Message_queue_Control *the_message_queue;
- Objects_Locations location;
ISR_lock_Context lock_context;
- if ( !count )
+ if ( count == NULL ) {
return RTEMS_INVALID_ADDRESS;
+ }
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
- );
- *count = the_message_queue->message_queue.number_of_pending_messages;
- _CORE_message_queue_Release(
- &the_message_queue->message_queue,
- &lock_context
- );
- return RTEMS_SUCCESSFUL;
+ if ( the_message_queue == NULL ) {
#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE:
- _Thread_Get_executing()->Wait.return_argument = count;
-
- return _Message_queue_MP_Send_request_packet(
- MESSAGE_QUEUE_MP_GET_NUMBER_PENDING_REQUEST,
- id,
- 0, /* buffer not used */
- 0, /* size */
- 0, /* option_set not used */
- MPCI_DEFAULT_TIMEOUT
- );
+ _Message_queue_MP_Get_number_pending( id, count );
+#else
+ return RTEMS_INVALID_ID;
#endif
-
- case OBJECTS_ERROR:
- break;
}
- return RTEMS_INVALID_ID;
+ _CORE_message_queue_Acquire_critical(
+ &the_message_queue->message_queue,
+ &lock_context
+ );
+ *count = the_message_queue->message_queue.number_of_pending_messages;
+ _CORE_message_queue_Release(
+ &the_message_queue->message_queue,
+ &lock_context
+ );
+ return RTEMS_SUCCESSFUL;
}
diff --git a/cpukit/rtems/src/msgqreceive.c b/cpukit/rtems/src/msgqreceive.c
index e3b3466..2c8b90e 100644
--- a/cpukit/rtems/src/msgqreceive.c
+++ b/cpukit/rtems/src/msgqreceive.c
@@ -18,17 +18,9 @@
#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/threadimpl.h>
-#include <rtems/score/wkspace.h>
-#include <rtems/rtems/status.h>
-#include <rtems/rtems/attrimpl.h>
#include <rtems/rtems/messageimpl.h>
+#include <rtems/score/threadimpl.h>
#include <rtems/rtems/optionsimpl.h>
-#include <rtems/rtems/support.h>
THREAD_WAIT_QUEUE_OBJECT_ASSERT(
Message_queue_Control,
@@ -43,66 +35,48 @@ rtems_status_code rtems_message_queue_receive(
rtems_interval timeout
)
{
- Message_queue_Control *the_message_queue;
- Objects_Locations location;
- bool wait;
- Thread_Control *executing;
- ISR_lock_Context lock_context;
+ Message_queue_Control *the_message_queue;
+ ISR_lock_Context lock_context;
+ Thread_Control *executing;
- if ( !buffer )
+ if ( buffer == NULL ) {
return RTEMS_INVALID_ADDRESS;
+ }
- if ( !size )
+ if ( size == NULL ) {
return RTEMS_INVALID_ADDRESS;
+ }
the_message_queue = _Message_queue_Get_interrupt_disable(
id,
- &location,
&lock_context
);
- switch ( location ) {
-
- case OBJECTS_LOCAL:
- if ( _Options_Is_no_wait( option_set ) )
- wait = false;
- else
- wait = true;
-
- _CORE_message_queue_Acquire_critical(
- &the_message_queue->message_queue,
- &lock_context
- );
-
- executing = _Thread_Executing;
- _CORE_message_queue_Seize(
- &the_message_queue->message_queue,
- executing,
- the_message_queue->Object.id,
- buffer,
- size,
- wait,
- timeout,
- &lock_context
- );
- return _Message_queue_Translate_core_message_queue_return_code(
- executing->Wait.return_code
- );
+ if ( the_message_queue == NULL ) {
#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE:
- return _Message_queue_MP_Send_request_packet(
- MESSAGE_QUEUE_MP_RECEIVE_REQUEST,
- id,
- buffer,
- size,
- option_set,
- timeout
- );
+ _Message_queue_MP_Receive( id, buffer, size, option_set, timeout );
+#else
+ return RTEMS_INVALID_ID;
#endif
-
- case OBJECTS_ERROR:
- break;
}
- return RTEMS_INVALID_ID;
+ _CORE_message_queue_Acquire_critical(
+ &the_message_queue->message_queue,
+ &lock_context
+ );
+
+ executing = _Thread_Executing;
+ _CORE_message_queue_Seize(
+ &the_message_queue->message_queue,
+ executing,
+ the_message_queue->Object.id,
+ buffer,
+ size,
+ !_Options_Is_no_wait( option_set ),
+ timeout,
+ &lock_context
+ );
+ return _Message_queue_Translate_core_message_queue_return_code(
+ executing->Wait.return_code
+ );
}
diff --git a/cpukit/rtems/src/msgqsend.c b/cpukit/rtems/src/msgqsend.c
index 355475c..af8f3c9 100644
--- a/cpukit/rtems/src/msgqsend.c
+++ b/cpukit/rtems/src/msgqsend.c
@@ -18,17 +18,7 @@
#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>
rtems_status_code rtems_message_queue_send(
rtems_id id,
@@ -36,59 +26,46 @@ rtems_status_code rtems_message_queue_send(
size_t size
)
{
- Message_queue_Control *the_message_queue;
- Objects_Locations location;
- CORE_message_queue_Status status;
- ISR_lock_Context lock_context;
+ Message_queue_Control *the_message_queue;
+ ISR_lock_Context lock_context;
+ CORE_message_queue_Status status;
- if ( !buffer )
+ if ( buffer == NULL ) {
return RTEMS_INVALID_ADDRESS;
+ }
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
- );
- status = _CORE_message_queue_Send(
- &the_message_queue->message_queue,
- buffer,
- size,
- _Message_queue_Core_message_queue_mp_support,
- id,
- false, /* sender does not block */
- 0, /* no timeout */
- &lock_context
- );
-
- /*
- * Since this API does not allow for blocking sends, we can directly
- * return the returned status.
- */
-
- return _Message_queue_Translate_core_message_queue_return_code(status);
+ if ( the_message_queue == NULL ) {
#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE:
- return _Message_queue_MP_Send_request_packet(
- MESSAGE_QUEUE_MP_SEND_REQUEST,
- id,
- buffer,
- &size,
- 0, /* option_set */
- MPCI_DEFAULT_TIMEOUT
- );
- break;
+ _Message_queue_MP_Send( id, buffer, size );
+#else
+ return RTEMS_INVALID_ID;
#endif
-
- case OBJECTS_ERROR:
- break;
}
- return RTEMS_INVALID_ID;
+
+ _CORE_message_queue_Acquire_critical(
+ &the_message_queue->message_queue,
+ &lock_context
+ );
+ status = _CORE_message_queue_Send(
+ &the_message_queue->message_queue,
+ buffer,
+ size,
+ _Message_queue_Core_message_queue_mp_support,
+ id,
+ false, /* sender does not block */
+ 0, /* no timeout */
+ &lock_context
+ );
+
+ /*
+ * Since this API does not allow for blocking sends, we can directly
+ * return the returned status.
+ */
+
+ return _Message_queue_Translate_core_message_queue_return_code( status );
}
diff --git a/cpukit/rtems/src/msgqurgent.c b/cpukit/rtems/src/msgqurgent.c
index 430f9a1..5220ce8 100644
--- a/cpukit/rtems/src/msgqurgent.c
+++ b/cpukit/rtems/src/msgqurgent.c
@@ -18,17 +18,7 @@
#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>
rtems_status_code rtems_message_queue_urgent(
rtems_id id,
@@ -36,59 +26,46 @@ rtems_status_code rtems_message_queue_urgent(
size_t size
)
{
- Message_queue_Control *the_message_queue;
- Objects_Locations location;
- CORE_message_queue_Status status;
- ISR_lock_Context lock_context;
+ Message_queue_Control *the_message_queue;
+ ISR_lock_Context lock_context;
+ CORE_message_queue_Status status;
- if ( !buffer )
+ if ( buffer == NULL ) {
return RTEMS_INVALID_ADDRESS;
+ }
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
- );
- status = _CORE_message_queue_Urgent(
- &the_message_queue->message_queue,
- buffer,
- size,
- _Message_queue_Core_message_queue_mp_support,
- id,
- false, /* sender does not block */
- 0, /* no timeout */
- &lock_context
- );
-
- /*
- * Since this API does not allow for blocking sends, we can directly
- * return the returned status.
- */
-
- return _Message_queue_Translate_core_message_queue_return_code(status);
+ if ( the_message_queue == NULL ) {
#if defined(RTEMS_MULTIPROCESSING)
- case OBJECTS_REMOTE:
- return _Message_queue_MP_Send_request_packet(
- MESSAGE_QUEUE_MP_URGENT_REQUEST,
- id,
- buffer,
- &size,
- 0, /* option_set */
- MPCI_DEFAULT_TIMEOUT
- );
+ _Message_queue_MP_Urgent( id, buffer, size );
+#else
+ return RTEMS_INVALID_ID;
#endif
-
- case OBJECTS_ERROR:
- break;
}
- return RTEMS_INVALID_ID;
+ _CORE_message_queue_Acquire_critical(
+ &the_message_queue->message_queue,
+ &lock_context
+ );
+ status = _CORE_message_queue_Urgent(
+ &the_message_queue->message_queue,
+ buffer,
+ size,
+ _Message_queue_Core_message_queue_mp_support,
+ id,
+ false, /* sender does not block */
+ 0, /* no timeout */
+ &lock_context
+ );
+
+ /*
+ * Since this API does not allow for blocking sends, we can directly
+ * return the returned status.
+ */
+
+ return _Message_queue_Translate_core_message_queue_return_code( status );
}
--
1.8.4.5
More information about the devel
mailing list