Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
ea76d3f4
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ea76d3f4
编写于
2月 08, 2012
作者:
B
Brian Anderson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rt: Add rust_task::call_on_c_stack
上级
1e2fe4ab
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
24 addition
and
7 deletion
+24
-7
src/rt/rust_task.cpp
src/rt/rust_task.cpp
+19
-2
src/rt/rust_task.h
src/rt/rust_task.h
+2
-0
src/rt/rust_upcall.cpp
src/rt/rust_upcall.cpp
+3
-5
未找到文件。
src/rt/rust_task.cpp
浏览文件 @
ea76d3f4
...
...
@@ -194,7 +194,7 @@ void task_start_wrapper(spawn_args *a)
// The cleanup work needs lots of stack
cleanup_args
ca
=
{
a
,
threw_exception
};
task
->
thread
->
c_context
.
call_and_change_stacks
(
&
ca
,
(
void
*
)
cleanup_task
);
task
->
call_on_c_stack
(
&
ca
,
(
void
*
)
cleanup_task
);
task
->
ctx
.
next
->
swap
(
task
->
ctx
);
}
...
...
@@ -699,7 +699,18 @@ Returns true if we're currently running on the Rust stack
*/
bool
rust_task
::
on_rust_stack
()
{
return
sp_in_stk_seg
(
get_sp
(),
stk
);
uintptr_t
sp
=
get_sp
();
bool
in_first_segment
=
sp_in_stk_seg
(
sp
,
stk
);
if
(
in_first_segment
)
{
return
true
;
}
else
if
(
stk
->
next
!=
NULL
)
{
// This happens only when calling the upcall to delete
// a stack segment
bool
in_second_segment
=
sp_in_stk_seg
(
sp
,
stk
->
next
);
return
in_second_segment
;
}
else
{
return
false
;
}
}
void
...
...
@@ -713,6 +724,12 @@ rust_task::config_notify(chan_handle chan) {
notify_chan
=
chan
;
}
void
rust_task
::
call_on_c_stack
(
void
*
args
,
void
*
fn_ptr
)
{
I
(
thread
,
on_rust_stack
());
thread
->
c_context
.
call_and_change_stacks
(
args
,
fn_ptr
);
}
//
// Local Variables:
// mode: C++
...
...
src/rt/rust_task.h
浏览文件 @
ea76d3f4
...
...
@@ -181,6 +181,8 @@ public:
void
check_stack_canary
();
void
config_notify
(
chan_handle
chan
);
void
call_on_c_stack
(
void
*
args
,
void
*
fn_ptr
);
};
//
...
...
src/rt/rust_upcall.cpp
浏览文件 @
ea76d3f4
...
...
@@ -47,8 +47,7 @@ inline void
call_upcall_on_c_stack
(
void
*
args
,
void
*
fn_ptr
)
{
check_stack_alignment
();
rust_task
*
task
=
rust_task_thread
::
get_task
();
rust_task_thread
*
thread
=
task
->
thread
;
thread
->
c_context
.
call_and_change_stacks
(
args
,
fn_ptr
);
task
->
call_on_c_stack
(
args
,
fn_ptr
);
}
extern
"C"
void
record_sp
(
void
*
limit
);
...
...
@@ -69,11 +68,10 @@ upcall_call_shim_on_c_stack(void *args, void *fn_ptr) {
// stack.
record_sp
(
0
);
rust_task_thread
*
thread
=
task
->
thread
;
try
{
t
hread
->
c_context
.
call_and_change_stacks
(
args
,
fn_ptr
);
t
ask
->
call_on_c_stack
(
args
,
fn_ptr
);
}
catch
(...)
{
A
(
thread
,
false
,
"Native code threw an exception"
);
A
(
t
ask
->
t
hread
,
false
,
"Native code threw an exception"
);
}
task
=
rust_task_thread
::
get_task
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录