diff --git a/compat/posix/src/misc.c b/compat/posix/src/misc.c index 821d42176c0390df00355a321b6bc15bdde90324..3950d95c9e00ec5cf4148f41acb18da2b635a664 100644 --- a/compat/posix/src/misc.c +++ b/compat/posix/src/misc.c @@ -40,6 +40,7 @@ #include "los_process_pri.h" #include "los_hw.h" +static struct rlimit g_defaultLimit = { 0 }; /* * Supply some suitable values for constants that may not be present * in all configurations. @@ -154,7 +155,9 @@ pid_t getpid(void) int getrlimit(int resource, struct rlimit *rlim) { + unsigned int intSave; LosProcessCB *pcb = OsCurrProcessGet(); + struct rlimit *resourceLimit = pcb->resourceLimit; switch (resource) { case RLIMIT_NOFILE: @@ -163,8 +166,15 @@ int getrlimit(int resource, struct rlimit *rlim) default: return -EINVAL; } - rlim->rlim_cur = pcb->pl_rlimit[resource].rlim_cur; - rlim->rlim_max = pcb->pl_rlimit[resource].rlim_max; + + if (resourceLimit == NULL) { + resourceLimit = &g_defaultLimit; + } + + SCHEDULER_LOCK(intSave); + rlim->rlim_cur = resourceLimit[resource].rlim_cur; + rlim->rlim_max = resourceLimit[resource].rlim_max; + SCHEDULER_UNLOCK(intSave); return 0; } @@ -175,6 +185,8 @@ int getrlimit(int resource, struct rlimit *rlim) #endif int setrlimit(int resource, const struct rlimit *rlim) { + unsigned int intSave; + struct rlimit *resourceLimit = NULL; LosProcessCB *pcb = OsCurrProcessGet(); if (rlim->rlim_cur > rlim->rlim_max) { @@ -194,8 +206,23 @@ int setrlimit(int resource, const struct rlimit *rlim) default: return -EINVAL; } - pcb->pl_rlimit[resource].rlim_cur = rlim->rlim_cur; - pcb->pl_rlimit[resource].rlim_max = rlim->rlim_max; + if (pcb->resourceLimit == NULL) { + resourceLimit = LOS_MemAlloc((VOID *)m_aucSysMem0, RLIM_NLIMITS * sizeof(struct rlimit)); + if (resourceLimit == NULL) { + return -EINVAL; + } + } + + SCHEDULER_LOCK(intSave); + if (pcb->resourceLimit == NULL) { + pcb->resourceLimit = resourceLimit; + resourceLimit = NULL; + } + pcb->resourceLimit[resource].rlim_cur = rlim->rlim_cur; + pcb->resourceLimit[resource].rlim_max = rlim->rlim_max; + SCHEDULER_UNLOCK(intSave); + + (VOID)LOS_MemFree((VOID *)m_aucSysMem0, resourceLimit); return 0; -} \ No newline at end of file +} diff --git a/kernel/base/core/los_process.c b/kernel/base/core/los_process.c index adf53610dba51beba7220ef3d4a716eaa6ed0ae6..40c1e56bcf472915f1f0abf384b5db322a875e18 100644 --- a/kernel/base/core/los_process.c +++ b/kernel/base/core/los_process.c @@ -378,6 +378,11 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB) (VOID)memset_s(&(processCB->ipcInfo), sizeof(ProcIpcInfo), 0, sizeof(ProcIpcInfo)); } #endif + + if (processCB->resourceLimit != NULL) { + (VOID)LOS_MemFree((VOID *)m_aucSysMem0, processCB->resourceLimit); + processCB->resourceLimit = NULL; + } } LITE_OS_SEC_TEXT STATIC VOID OsRecycleZombiesProcess(LosProcessCB *childCB, ProcessGroup **group) diff --git a/kernel/base/include/los_process_pri.h b/kernel/base/include/los_process_pri.h index 2b64fb57c871869cb714db1f543f00a5c2ce46e8..1e94deaf84fd544fe2ec001afd3ddd503ba5395e 100644 --- a/kernel/base/include/los_process_pri.h +++ b/kernel/base/include/los_process_pri.h @@ -127,7 +127,7 @@ typedef struct ProcessCB { #ifdef LOSCFG_KERNEL_CPUP OsCpupBase processCpup; /**< Process cpu usage */ #endif - struct rlimit pl_rlimit[RLIM_NLIMITS]; + struct rlimit *resourceLimit; } LosProcessCB; #define CLONE_VM 0x00000100