Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
d3d31105
R
Rust
项目概览
int
/
Rust
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
d3d31105
编写于
8月 06, 2018
作者:
R
Ralf Jung
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
clarify partially initialized Mutex issues
上级
7c98d2e6
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
33 addition
and
2 deletion
+33
-2
src/libstd/io/lazy.rs
src/libstd/io/lazy.rs
+7
-0
src/libstd/sys/unix/args.rs
src/libstd/sys/unix/args.rs
+3
-0
src/libstd/sys/unix/mutex.rs
src/libstd/sys/unix/mutex.rs
+4
-2
src/libstd/sys/unix/os.rs
src/libstd/sys/unix/os.rs
+3
-0
src/libstd/sys_common/at_exit_imp.rs
src/libstd/sys_common/at_exit_imp.rs
+6
-0
src/libstd/sys_common/mutex.rs
src/libstd/sys_common/mutex.rs
+4
-0
src/libstd/sys_common/thread_local.rs
src/libstd/sys_common/thread_local.rs
+3
-0
src/libstd/thread/mod.rs
src/libstd/thread/mod.rs
+3
-0
未找到文件。
src/libstd/io/lazy.rs
浏览文件 @
d3d31105
...
...
@@ -27,6 +27,9 @@ unsafe impl<T> Sync for Lazy<T> {}
impl
<
T
:
Send
+
Sync
+
'static
>
Lazy
<
T
>
{
pub
const
fn
new
(
init
:
fn
()
->
Arc
<
T
>
)
->
Lazy
<
T
>
{
// `lock` is never initialized fully, so this mutex is reentrant!
// Do not use it in a way that might be reentrant, that could lead to
// aliasing `&mut`.
Lazy
{
lock
:
Mutex
::
new
(),
ptr
:
Cell
::
new
(
ptr
::
null_mut
()),
...
...
@@ -48,6 +51,7 @@ pub fn get(&'static self) -> Option<Arc<T>> {
}
}
// Must only be called with `lock` held
unsafe
fn
init
(
&
'static
self
)
->
Arc
<
T
>
{
// If we successfully register an at exit handler, then we cache the
// `Arc` allocation in our own internal box (it will get deallocated by
...
...
@@ -60,6 +64,9 @@ unsafe fn init(&'static self) -> Arc<T> {
};
drop
(
Box
::
from_raw
(
ptr
))
});
// This could reentrantly call `init` again, which is a problem
// because our `lock` allows reentrancy!
// FIXME: Add argument why this is okay.
let
ret
=
(
self
.init
)();
if
registered
.is_ok
()
{
self
.ptr
.set
(
Box
::
into_raw
(
Box
::
new
(
ret
.clone
())));
...
...
src/libstd/sys/unix/args.rs
浏览文件 @
d3d31105
...
...
@@ -80,6 +80,9 @@ mod imp {
static
mut
ARGC
:
isize
=
0
;
static
mut
ARGV
:
*
const
*
const
u8
=
ptr
::
null
();
// `ENV_LOCK` is never initialized fully, so this mutex is reentrant!
// Do not use it in a way that might be reentrant, that could lead to
// aliasing `&mut`.
static
LOCK
:
Mutex
=
Mutex
::
new
();
pub
unsafe
fn
init
(
argc
:
isize
,
argv
:
*
const
*
const
u8
)
{
...
...
src/libstd/sys/unix/mutex.rs
浏览文件 @
d3d31105
...
...
@@ -25,8 +25,10 @@ unsafe impl Sync for Mutex {}
#[allow(dead_code)]
// sys isn't exported yet
impl
Mutex
{
pub
const
fn
new
()
->
Mutex
{
// Might be moved and address is changing it is better to avoid
// initialization of potentially opaque OS data before it landed
// Might be moved to a different address, so it is better to avoid
// initialization of potentially opaque OS data before it landed.
// Be very careful using this newly constructed `Mutex`, it should
// be initialized by calling `init()` first!
Mutex
{
inner
:
UnsafeCell
::
new
(
libc
::
PTHREAD_MUTEX_INITIALIZER
)
}
}
#[inline]
...
...
src/libstd/sys/unix/os.rs
浏览文件 @
d3d31105
...
...
@@ -33,6 +33,9 @@
use
vec
;
const
TMPBUF_SZ
:
usize
=
128
;
// `ENV_LOCK` is never initialized fully, so this mutex is reentrant!
// Do not use it in a way that might be reentrant, that could lead to
// aliasing `&mut`.
static
ENV_LOCK
:
Mutex
=
Mutex
::
new
();
...
...
src/libstd/sys_common/at_exit_imp.rs
浏览文件 @
d3d31105
...
...
@@ -23,6 +23,9 @@
// on poisoning and this module needs to operate at a lower level than requiring
// the thread infrastructure to be in place (useful on the borders of
// initialization/destruction).
// `LOCK` is never initialized fully, so this mutex is reentrant!
// Do not use it in a way that might be reentrant, that could lead to
// aliasing `&mut`.
static
LOCK
:
Mutex
=
Mutex
::
new
();
static
mut
QUEUE
:
*
mut
Queue
=
ptr
::
null_mut
();
...
...
@@ -72,6 +75,9 @@ pub fn push(f: Box<dyn FnBox()>) -> bool {
unsafe
{
let
_
guard
=
LOCK
.lock
();
if
init
()
{
// This could reentrantly call `push` again, which is a problem because
// `LOCK` allows reentrancy!
// FIXME: Add argument why this is okay.
(
*
QUEUE
)
.push
(
f
);
true
}
else
{
...
...
src/libstd/sys_common/mutex.rs
浏览文件 @
d3d31105
...
...
@@ -24,11 +24,15 @@ impl Mutex {
///
/// Behavior is undefined if the mutex is moved after it is
/// first used with any of the functions below.
/// Also, the mutex might not be fully functional without calling
/// `init`! For example, on unix, the mutex is reentrant
/// until `init` reconfigures it appropriately.
pub
const
fn
new
()
->
Mutex
{
Mutex
(
imp
::
Mutex
::
new
())
}
/// Prepare the mutex for use.
///
/// This should be called once the mutex is at a stable memory address.
/// It must not be called concurrently with any other operation.
#[inline]
pub
unsafe
fn
init
(
&
mut
self
)
{
self
.0
.init
()
}
...
...
src/libstd/sys_common/thread_local.rs
浏览文件 @
d3d31105
...
...
@@ -161,6 +161,9 @@ unsafe fn lazy_init(&self) -> usize {
// Additionally a 0-index of a tls key hasn't been seen on windows, so
// we just simplify the whole branch.
if
imp
::
requires_synchronized_create
()
{
// `INIT_LOCK` is never initialized fully, so this mutex is reentrant!
// Do not use it in a way that might be reentrant, that could lead to
// aliasing `&mut`.
static
INIT_LOCK
:
Mutex
=
Mutex
::
new
();
let
_
guard
=
INIT_LOCK
.lock
();
let
mut
key
=
self
.key
.load
(
Ordering
::
SeqCst
);
...
...
src/libstd/thread/mod.rs
浏览文件 @
d3d31105
...
...
@@ -940,6 +940,9 @@ pub fn park_timeout(dur: Duration) {
impl
ThreadId
{
// Generate a new unique thread ID.
fn
new
()
->
ThreadId
{
// `GUARD` is never initialized fully, so this mutex is reentrant!
// Do not use it in a way that might be reentrant, that could lead to
// aliasing `&mut`.
static
GUARD
:
mutex
::
Mutex
=
mutex
::
Mutex
::
new
();
static
mut
COUNTER
:
u64
=
0
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录