/** * @brief Sends a message to the specified thread. * @details The sender is stopped until the receiver executes a * @p chMsgRelease()after receiving the message. * * @param[in] tp the pointer to the thread * @param[in] msg the message * @return The answer message from @p chMsgRelease(). * * @api */ msg_t chMsgSend(Thread *tp, msg_t msg) { Thread *ctp = currp; chDbgCheck(tp != NULL, "chMsgSend"); chSysLock(); ctp->p_msg = msg; ctp->p_u.wtobjp = &tp->p_msgqueue; msg_insert(ctp, &tp->p_msgqueue); if (tp->p_state == THD_STATE_WTMSG) chSchReadyI(tp); chSchGoSleepS(THD_STATE_SNDMSGQ); msg = ctp->p_u.rdymsg; chSysUnlock(); return msg; }
/** * @brief Sends a message to the specified thread. * @details The sender is stopped until the receiver executes a * @p chMsgRelease()after receiving the message. * * @param[in] tp the pointer to the thread * @param[in] msg the message * @return The answer message from @p chMsgRelease(). * * @api */ msg_t chMsgSend(thread_t *tp, msg_t msg) { thread_t *ctp = currp; chDbgCheck(tp != NULL); chSysLock(); ctp->u.sentmsg = msg; msg_insert(ctp, &tp->msgqueue); if (tp->state == CH_STATE_WTMSG) { (void) chSchReadyI(tp); } chSchGoSleepS(CH_STATE_SNDMSGQ); msg = ctp->u.rdymsg; chSysUnlock(); return msg; }