!305 fix: 修复OsQueueMailFree提早释放内存的问题
Merge pull request !305 from hpline/master
This commit is contained in:
commit
03bbc750ce
|
@ -512,7 +512,6 @@ END:
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueID, VOID *mailPool, VOID *mailMem)
|
LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueID, VOID *mailPool, VOID *mailMem)
|
||||||
{
|
{
|
||||||
VOID *mem = (VOID *)NULL;
|
|
||||||
UINT32 intSave;
|
UINT32 intSave;
|
||||||
LosQueueCB *queueCB = (LosQueueCB *)NULL;
|
LosQueueCB *queueCB = (LosQueueCB *)NULL;
|
||||||
LosTaskCB *resumedTask = (LosTaskCB *)NULL;
|
LosTaskCB *resumedTask = (LosTaskCB *)NULL;
|
||||||
|
@ -526,12 +525,6 @@ LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueID, VOID *mailPool, VOID *ma
|
||||||
}
|
}
|
||||||
|
|
||||||
intSave = LOS_IntLock();
|
intSave = LOS_IntLock();
|
||||||
|
|
||||||
if (LOS_MemboxFree(mailPool, mailMem)) {
|
|
||||||
LOS_IntRestore(intSave);
|
|
||||||
return LOS_ERRNO_QUEUE_MAIL_FREE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
queueCB = GET_QUEUE_HANDLE(queueID);
|
queueCB = GET_QUEUE_HANDLE(queueID);
|
||||||
if (queueCB->queueState == OS_QUEUE_UNUSED) {
|
if (queueCB->queueState == OS_QUEUE_UNUSED) {
|
||||||
LOS_IntRestore(intSave);
|
LOS_IntRestore(intSave);
|
||||||
|
@ -540,18 +533,22 @@ LITE_OS_SEC_TEXT UINT32 OsQueueMailFree(UINT32 queueID, VOID *mailPool, VOID *ma
|
||||||
|
|
||||||
if (!LOS_ListEmpty(&queueCB->memList)) {
|
if (!LOS_ListEmpty(&queueCB->memList)) {
|
||||||
resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&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);
|
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_IntRestore(intSave);
|
||||||
LOS_Schedule();
|
LOS_Schedule();
|
||||||
} else {
|
} 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);
|
LOS_IntRestore(intSave);
|
||||||
}
|
}
|
||||||
|
|
||||||
return LOS_OK;
|
return LOS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -636,7 +633,6 @@ LITE_OS_SEC_TEXT_MINOR UINT32 LOS_QueueInfoGet(UINT32 queueID, QUEUE_INFO_S *que
|
||||||
intSave = LOS_IntLock();
|
intSave = LOS_IntLock();
|
||||||
|
|
||||||
queueCB = (LosQueueCB *)GET_QUEUE_HANDLE(queueID);
|
queueCB = (LosQueueCB *)GET_QUEUE_HANDLE(queueID);
|
||||||
|
|
||||||
if (queueCB->queueState == OS_QUEUE_UNUSED) {
|
if (queueCB->queueState == OS_QUEUE_UNUSED) {
|
||||||
ret = LOS_ERRNO_QUEUE_NOT_CREATE;
|
ret = LOS_ERRNO_QUEUE_NOT_CREATE;
|
||||||
goto QUEUE_END;
|
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];
|
queueInfo->writableCnt = queueCB->readWriteableCnt[OS_QUEUE_WRITE];
|
||||||
|
|
||||||
LOS_DL_LIST_FOR_EACH_ENTRY(tskCB, &queueCB->readWriteList[OS_QUEUE_READ], LosTaskCB, pendList) {
|
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) {
|
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) {
|
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:
|
QUEUE_END:
|
||||||
|
|
Loading…
Reference in New Issue