!427 fix: 修复lwip2.0 增强在futex中异常挂死问题

Merge pull request !427 from zhushengle/futex
This commit is contained in:
openharmony_ci 2021-07-15 01:54:41 +00:00 committed by Gitee
commit d9ed4b4bf6
1 changed files with 19 additions and 8 deletions

View File

@ -199,6 +199,9 @@ STATIC INLINE VOID OsFutexReplaceQueueListHeadNode(FutexNode *oldHeadNode, Futex
LOS_DL_LIST *futexList = oldHeadNode->futexList.pstPrev; LOS_DL_LIST *futexList = oldHeadNode->futexList.pstPrev;
LOS_ListDelete(&oldHeadNode->futexList); LOS_ListDelete(&oldHeadNode->futexList);
LOS_ListHeadInsert(futexList, &newHeadNode->futexList); LOS_ListHeadInsert(futexList, &newHeadNode->futexList);
if ((newHeadNode->queueList.pstNext == NULL) || (newHeadNode->queueList.pstPrev == NULL)) {
LOS_ListInit(&newHeadNode->queueList);
}
} }
STATIC INLINE VOID OsFutexDeleteKeyFromFutexList(FutexNode *node) STATIC INLINE VOID OsFutexDeleteKeyFromFutexList(FutexNode *node)
@ -323,7 +326,6 @@ STATIC VOID OsFutexInsertNewFutexKeyToHash(FutexNode *node)
LOS_ListTailInsert(&(headNode->futexList), &(node->futexList)); LOS_ListTailInsert(&(headNode->futexList), &(node->futexList));
break; break;
} }
} }
EXIT: EXIT:
@ -797,6 +799,7 @@ EXIT_UNLOCK_ERR:
STATIC INT32 OsFutexRequeueInsertNewKey(UINTPTR newFutexKey, INT32 newIndex, FutexNode *oldHeadNode) STATIC INT32 OsFutexRequeueInsertNewKey(UINTPTR newFutexKey, INT32 newIndex, FutexNode *oldHeadNode)
{ {
BOOL queueListIsEmpty = FALSE;
INT32 ret; INT32 ret;
UINT32 intSave; UINT32 intSave;
LosTaskCB *task = NULL; LosTaskCB *task = NULL;
@ -817,25 +820,33 @@ STATIC INT32 OsFutexRequeueInsertNewKey(UINTPTR newFutexKey, INT32 newIndex, Fut
nextNode = OS_FUTEX_FROM_QUEUELIST(queueList); nextNode = OS_FUTEX_FROM_QUEUELIST(queueList);
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
if (LOS_ListEmpty(&nextNode->pendList)) { if (LOS_ListEmpty(&nextNode->pendList)) {
if (LOS_ListEmpty(queueList)) {
queueListIsEmpty = TRUE;
} else {
queueList = queueList->pstNext; queueList = queueList->pstNext;
}
OsFutexDeinitFutexNode(nextNode); OsFutexDeinitFutexNode(nextNode);
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
if (queueList->pstNext != NULL) { if (queueListIsEmpty) {
continue;
} else {
return LOS_OK; return LOS_OK;
} }
continue;
} }
task = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(nextNode->pendList))); task = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&(nextNode->pendList)));
if (LOS_ListEmpty(queueList)) {
queueListIsEmpty = TRUE;
} else {
queueList = queueList->pstNext; queueList = queueList->pstNext;
}
LOS_ListDelete(&nextNode->queueList); LOS_ListDelete(&nextNode->queueList);
ret = OsFutexInsertTasktoPendList(&newHeadNode, nextNode, task); ret = OsFutexInsertTasktoPendList(&newHeadNode, nextNode, task);
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
if (ret != LOS_OK) { if (ret != LOS_OK) {
PRINT_ERR("Futex requeue insert new key failed!\n"); PRINT_ERR("Futex requeue insert new key failed!\n");
} }
} while (queueList->pstNext != NULL); } while (!queueListIsEmpty);
return LOS_OK; return LOS_OK;
} }