diff --git a/kernel/base/ipc/los_signal.c b/kernel/base/ipc/los_signal.c index b598cae638817394c3ebc32bf726a3342c76e610..a4066845bc48df22474a8e2e53319b6b386487cf 100644 --- a/kernel/base/ipc/los_signal.c +++ b/kernel/base/ipc/los_signal.c @@ -71,37 +71,44 @@ 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. */ + /* copy tmpinfo to unbinfo. */ + (VOID)memcpy_s(&sigcb->sigunbinfo, sizeof(siginfo_t), &tmpInfoNode->info, sizeof(siginfo_t)); + /* delete tmpinfo from tmpList. */ *prevHook = tmpInfoNode->next; (VOID)LOS_MemFree(m_aucSysMem0, tmpInfoNode); tmpInfoNode = *prevHook; - continue; + break; } 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)); + /* try to find the old siginfo */ + SigInfoListNode *tmp = sigcb->tmpInfoListHead; + while (tmp != NULL) { + if (tmp->info.si_signo == info->si_signo) { + /* found it, break. */ + break; + } + tmp = tmp->next; + } + if (tmp == NULL) { - return LOS_NOK; + /* none, alloc new one */ + tmp = (SigInfoListNode *)LOS_MemAlloc(m_aucSysMem0, sizeof(SigInfoListNode)); + if (tmp == NULL) { + return LOS_NOK; + } + tmp->next = sigcb->tmpInfoListHead; + sigcb->tmpInfoListHead = tmp; } + (VOID)memcpy_s(&tmp->info, sizeof(siginfo_t), info, sizeof(siginfo_t)); - tmp->next = sigcb->tmpInfoListHead; - sigcb->tmpInfoListHead = tmp; return LOS_OK; }