fix: 修复PR520缺陷
【背景】 https://gitee.com/openharmony/kernel_liteos_a/pulls/520 上面修改,信号处理时才会释放申请的内存,当信号被屏蔽,且一直发送该信号时, 内存占用会不断变大 【修改方案】 1. 信号发送时已经有该信号的siginfo在链表中时,不再重新申请,重复使用之前的siginfo. 【影响】 对现有的产品编译不会有影响。 re#I4DEG5 Signed-off-by: lanleinan <lanleinan@163.com> Change-Id: I74b3b7ff0b9efb0179313af9a0c8d1e12d1db5bb
This commit is contained in:
parent
c360a97bab
commit
40338918d9
|
@ -71,37 +71,44 @@ STATIC VOID OsMoveTmpInfoToUnbInfo(sig_cb *sigcb, INT32 signo)
|
||||||
{
|
{
|
||||||
SigInfoListNode *tmpInfoNode = sigcb->tmpInfoListHead;
|
SigInfoListNode *tmpInfoNode = sigcb->tmpInfoListHead;
|
||||||
SigInfoListNode **prevHook = &sigcb->tmpInfoListHead;
|
SigInfoListNode **prevHook = &sigcb->tmpInfoListHead;
|
||||||
INT32 isFirstDel = 1;
|
|
||||||
while (tmpInfoNode != NULL) {
|
while (tmpInfoNode != NULL) {
|
||||||
if (tmpInfoNode->info.si_signo == signo) {
|
if (tmpInfoNode->info.si_signo == signo) {
|
||||||
/* In some case, many siginfos have same signo, only last one inserted list need copy to unbinfo. */
|
/* copy tmpinfo to unbinfo. */
|
||||||
if (isFirstDel) {
|
(VOID)memcpy_s(&sigcb->sigunbinfo, sizeof(siginfo_t), &tmpInfoNode->info, sizeof(siginfo_t));
|
||||||
/* copy tmpinfo to unbinfo. */
|
/* delete tmpinfo from tmpList. */
|
||||||
(VOID)memcpy_s(&sigcb->sigunbinfo, sizeof(siginfo_t), &tmpInfoNode->info, sizeof(siginfo_t));
|
|
||||||
isFirstDel = 0;
|
|
||||||
}
|
|
||||||
/* delete tmpinfo from tmpList. */
|
|
||||||
*prevHook = tmpInfoNode->next;
|
*prevHook = tmpInfoNode->next;
|
||||||
(VOID)LOS_MemFree(m_aucSysMem0, tmpInfoNode);
|
(VOID)LOS_MemFree(m_aucSysMem0, tmpInfoNode);
|
||||||
tmpInfoNode = *prevHook;
|
tmpInfoNode = *prevHook;
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
prevHook = &tmpInfoNode->next;
|
prevHook = &tmpInfoNode->next;
|
||||||
tmpInfoNode = tmpInfoNode->next;
|
tmpInfoNode = tmpInfoNode->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC INT32 OsAddSigInfoToTmpList(sig_cb *sigcb, siginfo_t *info)
|
STATIC INT32 OsAddSigInfoToTmpList(sig_cb *sigcb, siginfo_t *info)
|
||||||
{
|
{
|
||||||
SigInfoListNode *tmp = (SigInfoListNode *)LOS_MemAlloc(m_aucSysMem0, sizeof(SigInfoListNode));
|
/* try to find the old siginfo */
|
||||||
if (tmp == NULL) {
|
SigInfoListNode *tmp = sigcb->tmpInfoListHead;
|
||||||
return LOS_NOK;
|
while (tmp != NULL) {
|
||||||
|
if (tmp->info.si_signo == info->si_signo) {
|
||||||
|
/* found it, break. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
tmp = tmp->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tmp == NULL) {
|
||||||
|
/* 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));
|
(VOID)memcpy_s(&tmp->info, sizeof(siginfo_t), info, sizeof(siginfo_t));
|
||||||
tmp->next = sigcb->tmpInfoListHead;
|
|
||||||
sigcb->tmpInfoListHead = tmp;
|
|
||||||
|
|
||||||
return LOS_OK;
|
return LOS_OK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue