Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Kernel Liteos A
提交
6523c496
K
Kernel Liteos A
项目概览
OpenHarmony
/
Kernel Liteos A
1 年多 前同步成功
通知
464
Star
414
Fork
55
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
4
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel Liteos A
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
4
Issue
4
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
6523c496
编写于
4月 20, 2021
作者:
O
openharmony_ci
提交者:
Gitee
4月 20, 2021
浏览文件
操作
浏览文件
下载
差异文件
!159 同步master 分支已修复问题: setitimer 中定时给进程发信号时未持有调度锁,导致踩内存等问题
Merge pull request !159 from zhushengle/OpenHarmony_1.0.1_release
上级
5cbb83dc
1c0bbb66
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
22 addition
and
4 deletion
+22
-4
compat/posix/src/time.c
compat/posix/src/time.c
+22
-4
未找到文件。
compat/posix/src/time.c
浏览文件 @
6523c496
...
...
@@ -586,6 +586,7 @@ typedef struct {
static
VOID
SwtmrProc
(
UINTPTR
tmrArg
)
{
unsigned
int
intSave
;
int
sig
;
pid_t
pid
;
siginfo_t
info
;
...
...
@@ -610,7 +611,10 @@ static VOID SwtmrProc(UINTPTR tmrArg)
info
.
si_value
.
sival_ptr
=
arg
->
sigev_value
.
sival_ptr
;
/* Send the signal */
SCHEDULER_LOCK
(
intSave
);
OsDispatch
(
pid
,
&
info
,
OS_USER_KILL_PERMISSION
);
SCHEDULER_UNLOCK
(
intSave
);
return
;
}
...
...
@@ -883,8 +887,10 @@ clock_t times(struct tms *buf)
int
setitimer
(
int
which
,
const
struct
itimerval
*
value
,
struct
itimerval
*
ovalue
)
{
UINT32
intSave
;
LosTaskCB
*
taskCB
=
OS_TCB_FROM_TID
(
LOS_CurTaskIDGet
());
LosProcessCB
*
processCB
=
OS_PCB_FROM_PID
(
taskCB
->
processID
);
timer_t
timerID
=
0
;
struct
itimerspec
spec
;
struct
itimerspec
ospec
;
int
ret
=
LOS_OK
;
...
...
@@ -894,15 +900,27 @@ int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue
set_errno
(
EINVAL
);
return
-
1
;
}
LOS_TaskLock
();
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
)
{
LOS_TaskUnlock
();
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
))
{
set_errno
(
EINVAL
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录