SDOCM00114985 Macro to extract destination address from header
authorRamsey Harris <ramsey@ti.com>
Wed, 25 Feb 2015 20:23:38 +0000 (12:23 -0800)
committerRobert Tivy <rtivy@ti.com>
Thu, 26 Feb 2015 19:30:11 +0000 (11:30 -0800)
Modified the existing MessageQ_getDstQueue macro to extract both
the destination queue index and procId from the message header.
It was calling MultiProc_self to acquire the destination procId,
but this only works when invoked on the actual destination processor.

packages/ti/ipc/MessageQ.h

index 87e23153f604bf4026d50c27fb11fd5f776f8266..2baa868a57202b181c1eb2ab6c00b31eac29efda 100644 (file)
@@ -295,18 +295,33 @@ extern "C" {
 /*!
  *  @brief      Extract the destination queue ID from a message.
  *
- *  Can only be used on the same processor where the destination queue resides.
- *  This function should only be used by Message Queue Transport writers.
+ *  This function is typically used be a transport.
+ *
+ *  The destination address is written into the message header when
+ *  calling MessageQ_put(). Therefore, you can only use this function
+ *  to extract the destination queue ID after MessageQ_put() has been
+ *  called on the given message. However, ownership rules dictate that
+ *  you cannot dereference a message after calling MessageQ_put() (because
+ *  you have transfered ownership to the transport).
+ *
+ *  After receiving a message by calling MessageQ_get(), you may safely
+ *  use this function. Although there is little benefit from doing so.
+ *
+ *  When the message is given to the transport, the destination address
+ *  has been written into the message header. In addition, the transport
+ *  now has ownership of the message. So, it is appropriate for the transport
+ *  to use this macro.
  *
  *  @param[in]  msg     Message of type #MessageQ_Msg
  *
  *  @retval  queueId    Destination message queue ID of type #MessageQ_QueueId
  */
-#define MessageQ_getDstQueue(msg)                                             \
-        ((msg)->dstId == (MessageQ_QueueIndex)MessageQ_INVALIDMESSAGEQ) ?     \
-            (MessageQ_QueueId)MessageQ_INVALIDMESSAGEQ :                      \
-            (MessageQ_QueueId)(((MessageQ_QueueId)MultiProc_self() << 16u)    \
-            | (((MessageQ_Msg)(msg))->dstId))
+#define MessageQ_getDstQueue(msg) \
+        (((MessageQ_Msg)(msg))->dstId == \
+        (MessageQ_QueueIndex)MessageQ_INVALIDMESSAGEQ) ? \
+        (MessageQ_QueueId)MessageQ_INVALIDMESSAGEQ : \
+        (((MessageQ_QueueId)((MessageQ_Msg)(msg))->dstProc << 16u) \
+        | (((MessageQ_Msg)(msg))->dstId))
 
 
 /*!