Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
不穿格子衫的农民
TencentOS Tiny
提交
a58895f5
T
TencentOS Tiny
项目概览
不穿格子衫的农民
/
TencentOS Tiny
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TencentOS Tiny
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a58895f5
编写于
10月 30, 2019
作者:
C
Chen Han
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add mutex in critical section
上级
4080ef37
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
13 addition
and
3 deletion
+13
-3
arch/linux/posix/gcc/port.c
arch/linux/posix/gcc/port.c
+13
-3
未找到文件。
arch/linux/posix/gcc/port.c
浏览文件 @
a58895f5
...
...
@@ -81,17 +81,23 @@ interrupt_manager _int_manager={
};
static
uint64_t
tick_ms
=
0
;
static
pthread_t
main_thread_id
;
static
pthread_mutex_t
cpsr_mutex
;
#define CHECK_IS_MAIN_THREAD(main_thread_id) \
if(main_thread_id != pthread_self()) return
__PORT__
void
port_int_disable
(
void
)
{
sigset_t
signal_mask
,
*
manager_mask
=
NULL
;
if
(
_int_manager
.
count
==
0
){
pthread_mutex_lock
(
&
cpsr_mutex
);
manager_mask
=
&
(
_int_manager
.
signal_mask
);
sigfillset
(
&
signal_mask
);
_filter_signal
(
&
signal_mask
);
pthread_sigmask
(
SIG_BLOCK
,
&
signal_mask
,
manager_mask
);
}
_int_manager
.
count
++
;
sigfillset
(
&
signal_mask
);
_filter_signal
(
&
signal_mask
);
pthread_sigmask
(
SIG_BLOCK
,
&
signal_mask
,
manager_mask
);
}
__PORT__
void
port_int_enable
(
void
)
...
...
@@ -102,6 +108,7 @@ __PORT__ void port_int_enable(void)
if
(
_int_manager
.
count
==
0
){
sigaddset
(
&
(
_int_manager
.
signal_mask
),
SIG_RESUME
);
//ensure SIG_RESUME is blocked
_filter_signal
(
&
(
_int_manager
.
signal_mask
));
pthread_mutex_unlock
(
&
cpsr_mutex
);
pthread_sigmask
(
SIG_SETMASK
,
&
(
_int_manager
.
signal_mask
),
NULL
);
}
}
...
...
@@ -126,6 +133,8 @@ __PORT__ pthread_t port_create_thread(void *arg)
__PORT__
void
port_sched_start
(
void
)
{
main_thread_id
=
pthread_self
();
pthread_mutex_init
(
&
cpsr_mutex
,
NULL
);
_install_signal
(
SIG_SUSPEND
,
_handle_suspend_thread
);
_install_signal
(
SIG_RESUME
,
_handle_resume_thread
);
_install_signal
(
SIG_CONTEXT_SWITCH
,
_handle_context_switch
);
...
...
@@ -224,6 +233,7 @@ __PORT__ void _install_signal(int sig,void (*func)(int))
__PORT__
void
_handle_tick_signal
()
{
CHECK_IS_MAIN_THREAD
(
main_thread_id
);
tick_ms
++
;
if
(
tos_knl_is_running
())
{
tos_knl_irq_enter
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录