Safer messages mechanism for sandboxes.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@13467 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
parent
85ad133346
commit
ac68344811
|
@ -50,6 +50,12 @@
|
||||||
/* Module macros. */
|
/* Module macros. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
#if CH_CFG_USE_MESSAGES_PRIORITY == TRUE
|
||||||
|
#define __msg_insert(tp, qp) queue_prio_insert(tp, qp)
|
||||||
|
#else
|
||||||
|
#define __msg_insert(tp, qp) queue_insert(tp, qp)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* External declarations. */
|
/* External declarations. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
|
@ -63,12 +63,6 @@
|
||||||
/* Module local functions. */
|
/* Module local functions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
|
||||||
#if CH_CFG_USE_MESSAGES_PRIORITY == TRUE
|
|
||||||
#define msg_insert(tp, qp) queue_prio_insert(tp, qp)
|
|
||||||
#else
|
|
||||||
#define msg_insert(tp, qp) queue_insert(tp, qp)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
/* Module exported functions. */
|
/* Module exported functions. */
|
||||||
/*===========================================================================*/
|
/*===========================================================================*/
|
||||||
|
@ -91,7 +85,7 @@ msg_t chMsgSend(thread_t *tp, msg_t msg) {
|
||||||
|
|
||||||
chSysLock();
|
chSysLock();
|
||||||
ctp->u.sentmsg = msg;
|
ctp->u.sentmsg = msg;
|
||||||
msg_insert(ctp, &tp->msgqueue);
|
__msg_insert(ctp, &tp->msgqueue);
|
||||||
if (tp->state == CH_STATE_WTMSG) {
|
if (tp->state == CH_STATE_WTMSG) {
|
||||||
(void) chSchReadyI(tp);
|
(void) chSchReadyI(tp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,4 +143,51 @@ void sbStart(sb_class_t *sbcp, const sb_config_t *config) {
|
||||||
chSysHalt("returned");
|
chSysHalt("returned");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if (CH_CFG_USE_MESSAGES == TRUE) || defined(__DOXYGEN__)
|
||||||
|
/**
|
||||||
|
* @brief Sends a message to a sandboxed thread.
|
||||||
|
*
|
||||||
|
* @param[in] sbcp pointer to the sandbox object
|
||||||
|
* @param[in] msg message to be sent
|
||||||
|
* @param[in] timeout the number of ticks before the operation timeouts,
|
||||||
|
* the following special values are allowed:
|
||||||
|
* - @a TIME_INFINITE no timeout.
|
||||||
|
* .
|
||||||
|
* @return The returned message.
|
||||||
|
* @retval MSG_TIMEOUT if a timeout occurred.
|
||||||
|
* @retval MSG_RESET if the exchange aborted, sandboxed thread API usage
|
||||||
|
* error.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
msg_t sbSendMessageTimeout(sb_class_t *sbcp,
|
||||||
|
msg_t msg,
|
||||||
|
sysinterval_t timeout) {
|
||||||
|
thread_t *ctp = currp;
|
||||||
|
|
||||||
|
chDbgCheck(sbcp != NULL);
|
||||||
|
|
||||||
|
chSysLock();
|
||||||
|
|
||||||
|
/* Sending the message.*/
|
||||||
|
ctp->u.sentmsg = msg;
|
||||||
|
__msg_insert(ctp, &sbcp->tp->msgqueue);
|
||||||
|
if (sbcp->tp->state == CH_STATE_WTMSG) {
|
||||||
|
(void) chSchReadyI(sbcp->tp);
|
||||||
|
}
|
||||||
|
msg = chSchGoSleepTimeoutS(CH_STATE_SNDMSGQ, timeout);
|
||||||
|
|
||||||
|
/* If a timeout occurred while the boxed thread already received the message
|
||||||
|
then this thread needs to "unregister" as sender, the boxed error will
|
||||||
|
get SB_ERR_EBUSY when/if trying to reply.*/
|
||||||
|
if (sbcp->msg_tp == ctp) {
|
||||||
|
sbcp->msg_tp = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
chSysUnlock();
|
||||||
|
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
#endif /* CH_CFG_USE_MESSAGES == TRUE */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
|
@ -176,6 +176,9 @@ extern "C" {
|
||||||
bool sb_is_valid_write_range(sb_class_t *sbcp, void *start, size_t size);
|
bool sb_is_valid_write_range(sb_class_t *sbcp, void *start, size_t size);
|
||||||
void sbObjectInit(sb_class_t *sbcp);
|
void sbObjectInit(sb_class_t *sbcp);
|
||||||
void sbStart(sb_class_t *sbcp, const sb_config_t *config);
|
void sbStart(sb_class_t *sbcp, const sb_config_t *config);
|
||||||
|
msg_t sbSendMessageTimeout(sb_class_t *sbcp,
|
||||||
|
msg_t msg,
|
||||||
|
sysinterval_t timeout);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -209,13 +212,14 @@ static inline msg_t sbWait(sb_class_t *sbcp) {
|
||||||
* @param[in] sbcp pointer to the sandbox object
|
* @param[in] sbcp pointer to the sandbox object
|
||||||
* @param[in] msg message to be sent
|
* @param[in] msg message to be sent
|
||||||
* @return The returned message.
|
* @return The returned message.
|
||||||
* @retval MSG_RESET Sandboxed thread API usage error, exchange aborted.
|
* @retval MSG_RESET if the exchange aborted, sandboxed thread API usage
|
||||||
|
* error.
|
||||||
*
|
*
|
||||||
* @api
|
* @api
|
||||||
*/
|
*/
|
||||||
static inline msg_t sbSendMessage(sb_class_t *sbcp, msg_t msg) {
|
static inline msg_t sbSendMessage(sb_class_t *sbcp, msg_t msg) {
|
||||||
|
|
||||||
return chMsgSend(sbcp->tp, msg);
|
return sbSendMessageTimeout(sbcp, msg, TIME_INFINITE);
|
||||||
}
|
}
|
||||||
#endif /* CH_CFG_USE_MESSAGES == TRUE */
|
#endif /* CH_CFG_USE_MESSAGES == TRUE */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue