summaryrefslogtreecommitdiff
path: root/src/ipc.c
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2021-01-06 17:10:23 +0800
committerGitHub <[email protected]>2021-01-06 17:10:23 +0800
commit84c772ea4075a229fd9f0aa042b925435306788a (patch)
tree7561642f0db8a331173d1e7e69c0ff3501d8b5d6 /src/ipc.c
parent89a1f64f638a850d93324cd234d26374a2b0c3c1 (diff)
parent3f9b3f57ea7f166f19b7d49d071c01874506814d (diff)
Merge pull request #4218 from mysterywolf/urgent
[kernel] add rt_mb_urgent()
Diffstat (limited to 'src/ipc.c')
-rw-r--r--src/ipc.c67
1 files changed, 66 insertions, 1 deletions
diff --git a/src/ipc.c b/src/ipc.c
index 4261f617b0..be2baee9b5 100644
--- a/src/ipc.c
+++ b/src/ipc.c
@@ -37,6 +37,7 @@
* 2020-07-29 Meco Man fix thread->event_set/event_info when received an
* event without pending
* 2020-10-11 Meco Man add value overflow-check code
+ * 2021-01-03 Meco Man add rt_mb_urgent()
*/
#include <rtthread.h>
@@ -1533,7 +1534,6 @@ rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
if (mb->entry == mb->size && timeout == 0)
{
rt_hw_interrupt_enable(temp);
-
return -RT_EFULL;
}
@@ -1655,6 +1655,71 @@ rt_err_t rt_mb_send(rt_mailbox_t mb, rt_ubase_t value)
RTM_EXPORT(rt_mb_send);
/**
+ * This function will send an urgent mail to mailbox object, if there are threads
+ * suspended on mailbox object, it will be waked up. This function will return
+ * immediately.
+ *
+ * @param mb the mailbox object
+ * @param value the mail
+ *
+ * @return the error code
+ */
+rt_err_t rt_mb_urgent(rt_mailbox_t mb, rt_ubase_t value)
+{
+ register rt_ubase_t temp;
+
+ /* parameter check */
+ RT_ASSERT(mb != RT_NULL);
+ RT_ASSERT(rt_object_get_type(&mb->parent.parent) == RT_Object_Class_MailBox);
+
+ RT_OBJECT_HOOK_CALL(rt_object_put_hook, (&(mb->parent.parent)));
+
+ /* disable interrupt */
+ temp = rt_hw_interrupt_disable();
+
+ if (mb->entry == mb->size)
+ {
+ rt_hw_interrupt_enable(temp);
+ return -RT_EFULL;
+ }
+
+ /* rewind to the previous position */
+ if (mb->out_offset > 0)
+ {
+ mb->out_offset --;
+ }
+ else
+ {
+ mb->out_offset = mb->size - 1;
+ }
+
+ /* set ptr */
+ mb->msg_pool[mb->out_offset] = value;
+
+ /* increase message entry */
+ mb->entry ++;
+
+ /* resume suspended thread */
+ if (!rt_list_isempty(&mb->parent.suspend_thread))
+ {
+ rt_ipc_list_resume(&(mb->parent.suspend_thread));
+
+ /* enable interrupt */
+ rt_hw_interrupt_enable(temp);
+
+ rt_schedule();
+
+ return RT_EOK;
+ }
+
+ /* enable interrupt */
+ rt_hw_interrupt_enable(temp);
+
+ return RT_EOK;
+}
+RTM_EXPORT(rt_mb_urgent);
+
+/**
* This function will receive a mail from mailbox object, if there is no mail
* in mailbox object, the thread shall wait for a specified time.
*