提交 6523c496 编写于 作者: O openharmony_ci 提交者: Gitee

!159 同步master 分支已修复问题: setitimer 中定时给进程发信号时未持有调度锁,导致踩内存等问题

Merge pull request !159 from zhushengle/OpenHarmony_1.0.1_release
...@@ -586,6 +586,7 @@ typedef struct { ...@@ -586,6 +586,7 @@ typedef struct {
static VOID SwtmrProc(UINTPTR tmrArg) static VOID SwtmrProc(UINTPTR tmrArg)
{ {
unsigned int intSave;
int sig; int sig;
pid_t pid; pid_t pid;
siginfo_t info; siginfo_t info;
...@@ -610,7 +611,10 @@ static VOID SwtmrProc(UINTPTR tmrArg) ...@@ -610,7 +611,10 @@ static VOID SwtmrProc(UINTPTR tmrArg)
info.si_value.sival_ptr = arg->sigev_value.sival_ptr; info.si_value.sival_ptr = arg->sigev_value.sival_ptr;
/* Send the signal */ /* Send the signal */
SCHEDULER_LOCK(intSave);
OsDispatch(pid, &info, OS_USER_KILL_PERMISSION); OsDispatch(pid, &info, OS_USER_KILL_PERMISSION);
SCHEDULER_UNLOCK(intSave);
return; return;
} }
...@@ -883,8 +887,10 @@ clock_t times(struct tms *buf) ...@@ -883,8 +887,10 @@ clock_t times(struct tms *buf)
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue) int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue)
{ {
UINT32 intSave;
LosTaskCB *taskCB = OS_TCB_FROM_TID(LOS_CurTaskIDGet()); LosTaskCB *taskCB = OS_TCB_FROM_TID(LOS_CurTaskIDGet());
LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID); LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID);
timer_t timerID = 0;
struct itimerspec spec; struct itimerspec spec;
struct itimerspec ospec; struct itimerspec ospec;
int ret = LOS_OK; int ret = LOS_OK;
...@@ -894,15 +900,27 @@ int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue ...@@ -894,15 +900,27 @@ int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue
set_errno(EINVAL); set_errno(EINVAL);
return -1; return -1;
} }
LOS_TaskLock();
if (processCB->timerID == (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID) { if (processCB->timerID == (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID) {
ret = timer_create(CLOCK_REALTIME, NULL, &processCB->timerID); ret = timer_create(CLOCK_REALTIME, NULL, &timerID);
if (ret != LOS_OK) { if (ret != LOS_OK) {
LOS_TaskUnlock();
return ret; return ret;
} }
} }
LOS_TaskUnlock();
/* The initialization of this global timer must be in spinlock
* timer_create cannot be located in spinlock.
*/
SCHEDULER_LOCK(intSave);
if (processCB->timerID == (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID) {
processCB->timerID = timerID;
SCHEDULER_UNLOCK(intSave);
} else {
SCHEDULER_UNLOCK(intSave);
if (timerID) {
timer_delete(timerID);
}
}
if (!ValidTimeval(&value->it_value) || !ValidTimeval(&value->it_interval)) { if (!ValidTimeval(&value->it_value) || !ValidTimeval(&value->it_interval)) {
set_errno(EINVAL); set_errno(EINVAL);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册