From c3facd1b9537f293b4ea81d5a0215595ca931bae Mon Sep 17 00:00:00 2001 From: lnlan Date: Wed, 4 Aug 2021 00:56:39 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dsigwait=E7=AD=89?= =?UTF-8?q?=E5=BE=85=E5=88=B0=E7=9A=84=E4=BF=A1=E5=8F=B7=E5=80=BC=E4=B8=8E?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=9A=84siginfo=E4=B8=AD=E7=9A=84=E5=80=BC?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4=20=E3=80=90=E8=83=8C=E6=99=AF?= =?UTF-8?q?=E3=80=91=20=E9=9B=86=E6=88=90=E6=B5=8B=E8=AF=95=E5=8F=91?= =?UTF-8?q?=E9=80=81=E4=B8=A4=E4=B8=AA=E4=B8=8D=E5=90=8C=E7=9A=84=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7=EF=BC=8Csigwait=E7=AC=AC=E4=BA=8C=E6=AC=A1=E7=AD=89?= =?UTF-8?q?=E5=88=B0=E7=9A=84=E4=BB=8D=E6=98=AF=E7=AC=AC=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7=20=E7=BB=8F=E5=AE=9A=E4=BD=8D=EF=BC=8C?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7=E5=9C=A8kill=E6=97=B6=E4=BC=9A=E5=B0=86?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=9A=84siginfo=E4=BF=A1=E6=81=AF=E6=8B=B7?= =?UTF-8?q?=E8=B4=9D=E5=88=B0taskcb=E7=9A=84unbinfo=E4=B8=AD=EF=BC=8Csigwa?= =?UTF-8?q?it=20=E5=A4=84=E7=90=86=E6=97=B6=E4=BB=8Eunbinfo=E6=8B=B7?= =?UTF-8?q?=E8=B4=9D=E7=BB=99=E7=94=A8=E6=88=B7=E3=80=82=E8=8B=A5=E6=AD=A4?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7=E5=8F=91=E9=80=81=E6=97=B6=E5=A4=84=E4=BA=8E?= =?UTF-8?q?=E5=B1=8F=E8=94=BD=E7=8A=B6=E6=80=81=EF=BC=8C=E5=86=8D=E6=9C=89?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E4=BF=A1=E5=8F=B7=E5=8F=91=E9=80=81=E4=BC=9A?= =?UTF-8?q?=E8=A6=86=E7=9B=96=20=E6=8E=89unbinfo=EF=BC=8C=E6=AD=A4?= =?UTF-8?q?=E6=97=B6sigwait=E7=AD=89=E5=BE=85=E8=BF=99=E4=B8=AA=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7=E8=8E=B7=E5=8F=96=E5=88=B0=E7=9A=84info=E5=B7=B2?= =?UTF-8?q?=E7=BB=8F=E8=A2=AB=E8=A6=86=E7=9B=96=20=E3=80=90=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=96=B9=E6=A1=88=E3=80=91=201.=20=E6=AF=8F=E4=B8=AA?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AAsiginfo?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E9=93=BE=E8=A1=A8=EF=BC=8C=E5=9C=A8=E5=A4=84?= =?UTF-8?q?=E7=90=86=E4=BF=A1=E5=8F=B7=E5=89=8D=E5=A4=95=E4=BB=8E=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E9=93=BE=E8=A1=A8=E5=8F=96=E5=87=BAinfo=E5=88=B0unbin?= =?UTF-8?q?fo=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【影响】 对现有的产品编译不会有影响。 re #I3M12H Signed-off-by: lanleinan Change-Id: If4b064c18773f8eca7419c665977260167b09810 --- kernel/base/core/los_task.c | 1 + kernel/base/include/los_signal.h | 7 ++++ kernel/base/ipc/los_signal.c | 58 ++++++++++++++++++++++++++++++-- 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/kernel/base/core/los_task.c b/kernel/base/core/los_task.c index 0ff89df5..67b7ab64 100644 --- a/kernel/base/core/los_task.c +++ b/kernel/base/core/los_task.c @@ -498,6 +498,7 @@ LITE_OS_SEC_TEXT VOID OsTaskResourcesToFree(LosTaskCB *taskCB) OsTaskKernelResourcesToFree(syncSignal, topOfStack); SCHEDULER_LOCK(intSave); + OsClearSigInfoTmpList(&(taskCB->sig)); OsInsertTCBToFreeList(taskCB); SCHEDULER_UNLOCK(intSave); } diff --git a/kernel/base/include/los_signal.h b/kernel/base/include/los_signal.h index aa113374..eabc2b09 100644 --- a/kernel/base/include/los_signal.h +++ b/kernel/base/include/los_signal.h @@ -132,6 +132,11 @@ struct sq_queue_s { }; typedef struct sq_queue_s sq_queue_t; +typedef struct SigInfoListNode { + struct SigInfoListNode *next; + siginfo_t info; +} SigInfoListNode; + typedef struct { sigset_t sigFlag; sigset_t sigPendFlag; @@ -140,6 +145,7 @@ typedef struct { LOS_DL_LIST waitList; sigset_t sigwaitmask; /* Waiting for pending signals */ siginfo_t sigunbinfo; /* Signal info when task unblocked */ + SigInfoListNode *tmpInfoListHead; /* Signal info List */ unsigned int sigIntLock; void *sigContext; unsigned int count; @@ -167,6 +173,7 @@ int OsSigSuspend(const sigset_t *set); VOID OsSigIntLock(VOID); VOID OsSigIntUnlock(VOID); INT32 OsTaskKillUnsafe(UINT32 taskID, INT32 signo); +VOID OsClearSigInfoTmpList(sig_cb *sigcb); #ifdef __cplusplus #if __cplusplus diff --git a/kernel/base/ipc/los_signal.c b/kernel/base/ipc/los_signal.c index 71b98b88..5dce0b44 100644 --- a/kernel/base/ipc/los_signal.c +++ b/kernel/base/ipc/los_signal.c @@ -67,11 +67,60 @@ int OsSigIsMember(const sigset_t *set, int signo) return ret; } +STATIC VOID OsMoveTmpInfoToUnbInfo(sig_cb *sigcb, INT32 signo) +{ + SigInfoListNode *tmpInfoNode = sigcb->tmpInfoListHead; + SigInfoListNode **prevHook = &sigcb->tmpInfoListHead; + INT32 isFirstDel = 1; + while (tmpInfoNode != NULL) { + if (tmpInfoNode->info.si_signo == signo) { + /* In some case, many siginfos have same signo, only last one inserted list need copy to unbinfo. */ + if (isFirstDel) { + /* copy tmpinfo to unbinfo. */ + (VOID)memcpy_s(&sigcb->sigunbinfo, sizeof(siginfo_t), &tmpInfoNode->info, sizeof(siginfo_t)); + isFirstDel = 0; + } + /* delete tmpinfo from tmpList. */ + *prevHook = tmpInfoNode->next; + (VOID)LOS_MemFree(m_aucSysMem0, tmpInfoNode); + tmpInfoNode = *prevHook; + continue; + } + prevHook = &tmpInfoNode->next; + tmpInfoNode = tmpInfoNode->next; + } + + return; +} + +STATIC INT32 OsAddSigInfoToTmpList(sig_cb *sigcb, siginfo_t *info) +{ + SigInfoListNode *tmp = (SigInfoListNode *)LOS_MemAlloc(m_aucSysMem0, sizeof(SigInfoListNode)); + if (tmp == NULL) { + return LOS_NOK; + } + (VOID)memcpy_s(&tmp->info, sizeof(siginfo_t), info, sizeof(siginfo_t)); + tmp->next = sigcb->tmpInfoListHead; + sigcb->tmpInfoListHead = tmp; + + return LOS_OK; +} + +VOID OsClearSigInfoTmpList(sig_cb *sigcb) +{ + while (sigcb->tmpInfoListHead != NULL) { + SigInfoListNode *tmpInfoNode = sigcb->tmpInfoListHead; + sigcb->tmpInfoListHead = sigcb->tmpInfoListHead->next; + (VOID)LOS_MemFree(m_aucSysMem0, tmpInfoNode); + } +} + STATIC INLINE VOID OsSigWaitTaskWake(LosTaskCB *taskCB, INT32 signo) { sig_cb *sigcb = &taskCB->sig; if (!LOS_ListEmpty(&sigcb->waitList) && OsSigIsMember(&sigcb->sigwaitmask, signo)) { + OsMoveTmpInfoToUnbInfo(sigcb, signo); OsTaskWakeClearPendMask(taskCB); OsSchedTaskWake(taskCB); OsSigEmptySet(&sigcb->sigwaitmask); @@ -141,7 +190,10 @@ int OsTcbDispatch(LosTaskCB *stcb, siginfo_t *info) /* unmasked signal actions */ OsSigAddSet(&sigcb->sigFlag, info->si_signo); } - (void) memcpy_s(&sigcb->sigunbinfo, sizeof(siginfo_t), info, sizeof(siginfo_t)); + + if (OsAddSigInfoToTmpList(sigcb, info) == LOS_NOK) { + return -ENOMEM; + } return OsPendingTaskWake(stcb, info->si_signo); } @@ -516,6 +568,7 @@ int OsSigTimedWaitNoLock(sigset_t *set, siginfo_t *info, unsigned int timeout) if (clear) { sigcb->sigPendFlag ^= clear; ret = FindFirstSetedBit((UINT64)clear) + 1; + OsMoveTmpInfoToUnbInfo(sigcb, ret); } else { OsSigAddSet(set, SIGKILL); OsSigAddSet(set, SIGSTOP); @@ -529,7 +582,7 @@ int OsSigTimedWaitNoLock(sigset_t *set, siginfo_t *info, unsigned int timeout) sigcb->sigwaitmask = NULL_SIGNAL_SET; } if (info != NULL) { - (void) memcpy_s(info, sizeof(siginfo_t), &sigcb->sigunbinfo, sizeof(siginfo_t)); + (VOID)memcpy_s(info, sizeof(siginfo_t), &sigcb->sigunbinfo, sizeof(siginfo_t)); } return ret; } @@ -657,6 +710,7 @@ VOID *OsSaveSignalContext(VOID *sp, VOID *newSp) sigcb->sigFlag |= process->sigShare; UINT32 signo = (UINT32)FindFirstSetedBit(sigcb->sigFlag) + 1; UINT32 sigVal = (UINT32)(UINTPTR)(sigcb->sigunbinfo.si_value.sival_ptr); + OsMoveTmpInfoToUnbInfo(sigcb, signo); OsProcessExitCodeSignalSet(process, signo); sigcb->sigContext = sp;