diff --git a/kernel/src/los_queue.c b/kernel/src/los_queue.c index 0245429a..12f45069 100644 --- a/kernel/src/los_queue.c +++ b/kernel/src/los_queue.c @@ -512,7 +512,6 @@ END: *****************************************************************************/ LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueID, VOID *mailPool, VOID *mailMem) { - VOID *mem = (VOID *)NULL; UINT32 intSave; LosQueueCB *queueCB = (LosQueueCB *)NULL; LosTaskCB *resumedTask = (LosTaskCB *)NULL; @@ -526,12 +525,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); @@ -540,18 +533,22 @@ 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)); + /* When enter this branch, it means the resumed task can + * get an available mailMem. + */ + resumedTask->msg = mailMem; OsSchedTaskWake(resumedTask); - mem = LOS_MemboxAlloc(mailPool); - if (mem == NULL) { - LOS_IntRestore(intSave); - return LOS_ERRNO_QUEUE_NO_MEMORY; - } - resumedTask->msg = mem; 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; } @@ -636,7 +633,6 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_QueueInfoGet(UINT32 queueID, QUEUE_INFO_S *que intSave = LOS_IntLock(); queueCB = (LosQueueCB *)GET_QUEUE_HANDLE(queueID); - if (queueCB->queueState == OS_QUEUE_UNUSED) { ret = LOS_ERRNO_QUEUE_NOT_CREATE; goto QUEUE_END; @@ -651,15 +647,18 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_QueueInfoGet(UINT32 queueID, QUEUE_INFO_S *que queueInfo->writableCnt = queueCB->readWriteableCnt[OS_QUEUE_WRITE]; LOS_DL_LIST_FOR_EACH_ENTRY(tskCB, &queueCB->readWriteList[OS_QUEUE_READ], LosTaskCB, pendList) { - queueInfo->waitReadTask[OS_WAIT_TASK_ID_TO_ARRAY_IDX(tskCB->taskID)] |= (1 << (tskCB->taskID & OS_WAIT_TASK_ARRAY_ELEMENT_MASK)); + queueInfo->waitReadTask[OS_WAIT_TASK_ID_TO_ARRAY_IDX(tskCB->taskID)] |= + (1 << (tskCB->taskID & OS_WAIT_TASK_ARRAY_ELEMENT_MASK)); } LOS_DL_LIST_FOR_EACH_ENTRY(tskCB, &queueCB->readWriteList[OS_QUEUE_WRITE], LosTaskCB, pendList) { - queueInfo->waitWriteTask[OS_WAIT_TASK_ID_TO_ARRAY_IDX(tskCB->taskID)] |= (1 << (tskCB->taskID & OS_WAIT_TASK_ARRAY_ELEMENT_MASK)); + queueInfo->waitWriteTask[OS_WAIT_TASK_ID_TO_ARRAY_IDX(tskCB->taskID)] |= + (1 << (tskCB->taskID & OS_WAIT_TASK_ARRAY_ELEMENT_MASK)); } LOS_DL_LIST_FOR_EACH_ENTRY(tskCB, &queueCB->memList, LosTaskCB, pendList) { - queueInfo->waitMemTask[OS_WAIT_TASK_ID_TO_ARRAY_IDX(tskCB->taskID)] |= (1 << (tskCB->taskID & OS_WAIT_TASK_ARRAY_ELEMENT_MASK)); + queueInfo->waitMemTask[OS_WAIT_TASK_ID_TO_ARRAY_IDX(tskCB->taskID)] |= + (1 << (tskCB->taskID & OS_WAIT_TASK_ARRAY_ELEMENT_MASK)); } QUEUE_END: