From ec88d1628937b3def6dd613246116f6bfa4141eb Mon Sep 17 00:00:00 2001 From: lurix Date: Mon, 13 Sep 2021 10:01:45 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DOsQueueMailFree?= =?UTF-8?q?=E6=8F=90=E6=97=A9=E9=87=8A=E6=94=BE=E5=86=85=E5=AD=98=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lurix --- kernel/src/los_queue.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/kernel/src/los_queue.c b/kernel/src/los_queue.c index 0245429a..6627a05c 100644 --- a/kernel/src/los_queue.c +++ b/kernel/src/los_queue.c @@ -526,12 +526,6 @@ LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueID, VOID *mailPool, VOID *ma } intSave = LOS_IntLock(); - - if (LOS_MemboxFree(mailPool, mailMem)) { - LOS_IntRestore(intSave); - return LOS_ERRNO_QUEUE_MAIL_FREE_ERROR; - } - queueCB = GET_QUEUE_HANDLE(queueID); if (queueCB->queueState == OS_QUEUE_UNUSED) { LOS_IntRestore(intSave); @@ -541,17 +535,24 @@ LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueID, VOID *mailPool, VOID *ma if (!LOS_ListEmpty(&queueCB->memList)) { resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&queueCB->memList)); OsSchedTaskWake(resumedTask); - mem = LOS_MemboxAlloc(mailPool); - if (mem == NULL) { - LOS_IntRestore(intSave); - return LOS_ERRNO_QUEUE_NO_MEMORY; - } - resumedTask->msg = mem; + /* When enters the current branch, means the resumed task already can get a available membox, + * so the resumedTask->msg can not be NULL. + */ + resumedTask->msg = mailMem; LOS_IntRestore(intSave); LOS_Schedule(); + } else { + /* No task waiting for the mailMem, + * so free it. + */ + if (LOS_MemboxFree(mailPool, mailMem)) { + LOS_IntRestore(intSave); + return LOS_ERRNO_QUEUE_MAIL_FREE_ERROR; + } LOS_IntRestore(intSave); } + return LOS_OK; }