Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
6115b13d
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,发现更多精彩内容 >>
提交
6115b13d
编写于
3月 21, 2012
作者:
B
Brian Anderson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rt: Don't switch to the C stack on the upcall_new_stack fast path
上级
8a145a60
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
41 addition
and
20 deletion
+41
-20
src/rt/rust_task.cpp
src/rt/rust_task.cpp
+32
-1
src/rt/rust_task.h
src/rt/rust_task.h
+4
-1
src/rt/rust_upcall.cpp
src/rt/rust_upcall.cpp
+5
-18
未找到文件。
src/rt/rust_task.cpp
浏览文件 @
6115b13d
...
...
@@ -509,6 +509,37 @@ rust_task::free_stack(stk_seg *stk) {
destroy_stack
(
&
local_region
,
stk
);
}
struct
new_stack_args
{
rust_task
*
task
;
size_t
requested_sz
;
};
void
new_stack_slow
(
new_stack_args
*
args
)
{
args
->
task
->
new_stack
(
args
->
requested_sz
);
}
// NB: This runs on the Rust stack
// This is the new stack fast path, in which we
// reuse the next cached stack segment
void
rust_task
::
new_stack_fast
(
size_t
requested_sz
)
{
// The minimum stack size, in bytes, of a Rust stack, excluding red zone
size_t
min_sz
=
thread
->
min_stack_size
;
// Try to reuse an existing stack segment
if
(
stk
!=
NULL
&&
stk
->
prev
!=
NULL
)
{
size_t
prev_sz
=
user_stack_size
(
stk
->
prev
);
if
(
min_sz
<=
prev_sz
&&
requested_sz
<=
prev_sz
)
{
stk
=
stk
->
prev
;
return
;
}
}
new_stack_args
args
=
{
this
,
requested_sz
};
call_on_c_stack
(
&
args
,
(
void
*
)
new_stack_slow
);
}
void
rust_task
::
new_stack
(
size_t
requested_sz
)
{
LOG
(
this
,
mem
,
"creating new stack for task %"
PRIxPTR
,
this
);
...
...
@@ -572,7 +603,7 @@ rust_task::next_stack(size_t stk_sz, void *args_addr, size_t args_sz) {
maybe_next_stack
=
stk
->
prev
;
}
new_stack
(
stk_sz
+
args_sz
);
new_stack
_fast
(
stk_sz
+
args_sz
);
A
(
thread
,
stk
->
end
-
(
uintptr_t
)
stk
->
data
>=
stk_sz
+
args_sz
,
"Did not receive enough stack"
);
uint8_t
*
new_sp
=
(
uint8_t
*
)
stk
->
end
;
...
...
src/rt/rust_task.h
浏览文件 @
6115b13d
...
...
@@ -33,6 +33,7 @@ typedef unsigned long task_result;
struct
spawn_args
;
struct
cleanup_args
;
struct
reset_args
;
struct
new_stack_args
;
// std::lib::task::task_notification
//
...
...
@@ -114,7 +115,8 @@ private:
// Called when the atomic refcount reaches zero
void
delete_this
();
void
new_stack
(
size_t
sz
);
void
new_stack_fast
(
size_t
requested_sz
);
void
new_stack
(
size_t
requested_sz
);
void
free_stack
(
stk_seg
*
stk
);
size_t
get_next_stack_size
(
size_t
min
,
size_t
current
,
size_t
requested
);
...
...
@@ -128,6 +130,7 @@ private:
friend
void
task_start_wrapper
(
spawn_args
*
a
);
friend
void
cleanup_task
(
cleanup_args
*
a
);
friend
void
reset_stack_limit_on_c_stack
(
reset_args
*
a
);
friend
void
new_stack_slow
(
new_stack_args
*
a
);
public:
...
...
src/rt/rust_upcall.cpp
浏览文件 @
6115b13d
...
...
@@ -439,26 +439,13 @@ upcall_log_type(const type_desc *tydesc, uint8_t *data, uint32_t level) {
UPCALL_SWITCH_STACK
(
&
args
,
upcall_s_log_type
);
}
struct
s_new_stack_args
{
void
*
result
;
size_t
stk_sz
;
void
*
args_addr
;
size_t
args_sz
;
};
extern
"C"
CDECL
void
upcall_s_new_stack
(
struct
s_new_stack_args
*
args
)
{
rust_task
*
task
=
rust_task_thread
::
get_task
();
args
->
result
=
task
->
next_stack
(
args
->
stk_sz
,
args
->
args_addr
,
args
->
args_sz
);
}
// NB: This needs to be blazing fast. Don't switch stacks
extern
"C"
CDECL
void
*
upcall_new_stack
(
size_t
stk_sz
,
void
*
args_addr
,
size_t
args_sz
)
{
s_new_stack_args
args
=
{
NULL
,
stk_sz
,
args_addr
,
args_sz
};
UPCALL_SWITCH_STACK
(
&
args
,
upcall_s_new_stack
);
return
args
.
result
;
rust_task
*
task
=
rust_task_thread
::
get_task
();
return
task
->
next_stack
(
stk_sz
,
args_addr
,
args_sz
);
}
// NB: This needs to be blazing fast. Don't switch stacks
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录