Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
a8c2d4fc
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,发现更多精彩内容 >>
提交
a8c2d4fc
编写于
10月 01, 2020
作者:
M
Mara Bos
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Move boxing and mutex checking logic of condvar into sys_common.
上级
f283d3f0
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
55 addition
and
78 deletion
+55
-78
library/std/src/sync/condvar.rs
library/std/src/sync/condvar.rs
+4
-40
library/std/src/sys_common/condvar.rs
library/std/src/sys_common/condvar.rs
+27
-37
library/std/src/sys_common/condvar/check.rs
library/std/src/sys_common/condvar/check.rs
+23
-0
library/std/src/sys_common/mutex.rs
library/std/src/sys_common/mutex.rs
+1
-1
未找到文件。
library/std/src/sync/condvar.rs
浏览文件 @
a8c2d4fc
...
...
@@ -2,10 +2,8 @@
mod
tests
;
use
crate
::
fmt
;
use
crate
::
sync
::
atomic
::{
AtomicUsize
,
Ordering
};
use
crate
::
sync
::{
mutex
,
MutexGuard
,
PoisonError
};
use
crate
::
sys_common
::
condvar
as
sys
;
use
crate
::
sys_common
::
mutex
as
sys_mutex
;
use
crate
::
sys_common
::
poison
::{
self
,
LockResult
};
use
crate
::
time
::{
Duration
,
Instant
};
...
...
@@ -109,8 +107,7 @@ pub fn timed_out(&self) -> bool {
/// ```
#[stable(feature
=
"rust1"
,
since
=
"1.0.0"
)]
pub
struct
Condvar
{
inner
:
Box
<
sys
::
Condvar
>
,
mutex
:
AtomicUsize
,
inner
:
sys
::
Condvar
,
}
impl
Condvar
{
...
...
@@ -126,11 +123,7 @@ impl Condvar {
/// ```
#[stable(feature
=
"rust1"
,
since
=
"1.0.0"
)]
pub
fn
new
()
->
Condvar
{
let
mut
c
=
Condvar
{
inner
:
box
sys
::
Condvar
::
new
(),
mutex
:
AtomicUsize
::
new
(
0
)
};
unsafe
{
c
.inner
.init
();
}
c
Condvar
{
inner
:
sys
::
Condvar
::
new
()
}
}
/// Blocks the current thread until this condition variable receives a
...
...
@@ -192,7 +185,6 @@ pub fn new() -> Condvar {
pub
fn
wait
<
'a
,
T
>
(
&
self
,
guard
:
MutexGuard
<
'a
,
T
>
)
->
LockResult
<
MutexGuard
<
'a
,
T
>>
{
let
poisoned
=
unsafe
{
let
lock
=
mutex
::
guard_lock
(
&
guard
);
self
.verify
(
lock
);
self
.inner
.wait
(
lock
);
mutex
::
guard_poison
(
&
guard
)
.get
()
};
...
...
@@ -389,7 +381,6 @@ pub fn wait_timeout<'a, T>(
)
->
LockResult
<
(
MutexGuard
<
'a
,
T
>
,
WaitTimeoutResult
)
>
{
let
(
poisoned
,
result
)
=
unsafe
{
let
lock
=
mutex
::
guard_lock
(
&
guard
);
self
.verify
(
lock
);
let
success
=
self
.inner
.wait_timeout
(
lock
,
dur
);
(
mutex
::
guard_poison
(
&
guard
)
.get
(),
WaitTimeoutResult
(
!
success
))
};
...
...
@@ -510,7 +501,7 @@ pub fn wait_timeout_while<'a, T, F>(
/// ```
#[stable(feature
=
"rust1"
,
since
=
"1.0.0"
)]
pub
fn
notify_one
(
&
self
)
{
unsafe
{
self
.inner
.notify_one
()
}
self
.inner
.notify_one
()
}
/// Wakes up all blocked threads on this condvar.
...
...
@@ -550,27 +541,7 @@ pub fn notify_one(&self) {
/// ```
#[stable(feature
=
"rust1"
,
since
=
"1.0.0"
)]
pub
fn
notify_all
(
&
self
)
{
unsafe
{
self
.inner
.notify_all
()
}
}
fn
verify
(
&
self
,
mutex
:
&
sys_mutex
::
MovableMutex
)
{
let
addr
=
mutex
.raw
()
as
*
const
_
as
usize
;
match
self
.mutex
.compare_and_swap
(
0
,
addr
,
Ordering
::
SeqCst
)
{
// If we got out 0, then we have successfully bound the mutex to
// this cvar.
0
=>
{}
// If we get out a value that's the same as `addr`, then someone
// already beat us to the punch.
n
if
n
==
addr
=>
{}
// Anything else and we're using more than one mutex on this cvar,
// which is currently disallowed.
_
=>
panic!
(
"attempted to use a condition variable with two
\
mutexes"
),
}
self
.inner
.notify_all
()
}
}
...
...
@@ -588,10 +559,3 @@ fn default() -> Condvar {
Condvar
::
new
()
}
}
#[stable(feature
=
"rust1"
,
since
=
"1.0.0"
)]
impl
Drop
for
Condvar
{
fn
drop
(
&
mut
self
)
{
unsafe
{
self
.inner
.destroy
()
}
}
}
library/std/src/sys_common/condvar.rs
浏览文件 @
a8c2d4fc
use
crate
::
sys
::
condvar
as
imp
;
use
crate
::
sys_common
::
mutex
::
MovableMutex
;
use
crate
::
time
::
Duration
;
use
check
::
CondvarCheck
;
mod
check
;
/// An OS-based condition variable.
///
/// This structure is the lowest layer possible on top of the OS-provided
/// condition variables. It is consequently entirely unsafe to use. It is
/// recommended to use the safer types at the top level of this crate instead of
/// this type.
pub
struct
Condvar
(
imp
::
Condvar
);
pub
struct
Condvar
{
inner
:
Box
<
imp
::
Condvar
>
,
check
:
CondvarCheck
,
}
impl
Condvar
{
/// Creates a new condition variable for use.
///
/// Behavior is undefined if the condition variable is moved after it is
/// first used with any of the functions below.
pub
const
fn
new
()
->
Condvar
{
Condvar
(
imp
::
Condvar
::
new
())
}
/// Prepares the condition variable for use.
///
/// This should be called once the condition variable is at a stable memory
/// address.
#[inline]
pub
unsafe
fn
init
(
&
mut
self
)
{
self
.0
.init
()
pub
fn
new
()
->
Self
{
let
mut
c
=
box
imp
::
Condvar
::
new
();
unsafe
{
c
.init
()
};
Self
{
inner
:
c
,
check
:
CondvarCheck
::
new
()
}
}
/// Signals one waiter on this condition variable to wake up.
#[inline]
pub
unsafe
fn
notify_one
(
&
self
)
{
self
.0
.notify_one
()
pub
fn
notify_one
(
&
self
)
{
unsafe
{
self
.inner
.notify_one
()
};
}
/// Awakens all current waiters on this condition variable.
#[inline]
pub
unsafe
fn
notify_all
(
&
self
)
{
self
.0
.notify_all
()
pub
fn
notify_all
(
&
self
)
{
unsafe
{
self
.inner
.notify_all
()
};
}
/// Waits for a signal on the specified mutex.
///
/// Behavior is undefined if the mutex is not locked by the current thread.
///
Behavior is also undefined if more than one mutex is used concurrently
///
on this condition variable
.
///
///
May panic if used with more than one mutex
.
#[inline]
pub
unsafe
fn
wait
(
&
self
,
mutex
:
&
MovableMutex
)
{
self
.0
.wait
(
mutex
.raw
())
self
.check
.verify
(
mutex
);
self
.inner
.wait
(
mutex
.raw
())
}
/// Waits for a signal on the specified mutex with a timeout duration
/// specified by `dur` (a relative time into the future).
///
/// Behavior is undefined if the mutex is not locked by the current thread.
///
Behavior is also undefined if more than one mutex is used concurrently
///
on this condition variable
.
///
///
May panic if used with more than one mutex
.
#[inline]
pub
unsafe
fn
wait_timeout
(
&
self
,
mutex
:
&
MovableMutex
,
dur
:
Duration
)
->
bool
{
self
.0
.wait_timeout
(
mutex
.raw
(),
dur
)
self
.check
.verify
(
mutex
);
self
.inner
.wait_timeout
(
mutex
.raw
(),
dur
)
}
}
/// Deallocates all resources associated with this condition variable.
///
/// Behavior is undefined if there are current or will be future users of
/// this condition variable.
#[inline]
pub
unsafe
fn
destroy
(
&
self
)
{
self
.0
.destroy
()
impl
Drop
for
Condvar
{
fn
drop
(
&
mut
self
)
{
unsafe
{
self
.inner
.destroy
()
};
}
}
library/std/src/sys_common/condvar/check.rs
0 → 100644
浏览文件 @
a8c2d4fc
use
crate
::
sync
::
atomic
::{
AtomicUsize
,
Ordering
};
use
crate
::
sys
::
mutex
as
mutex_imp
;
use
crate
::
sys_common
::
mutex
::
MovableMutex
;
/// A `Condvar` will check it's only ever used with the same mutex, based on
/// its (stable) address.
pub
struct
CondvarCheck
{
addr
:
AtomicUsize
,
}
impl
CondvarCheck
{
pub
const
fn
new
()
->
Self
{
Self
{
addr
:
AtomicUsize
::
new
(
0
)
}
}
pub
fn
verify
(
&
self
,
mutex
:
&
MovableMutex
)
{
let
addr
=
mutex
.raw
()
as
*
const
mutex_imp
::
Mutex
as
usize
;
match
self
.addr
.compare_and_swap
(
0
,
addr
,
Ordering
::
SeqCst
)
{
0
=>
{}
// Stored the address
n
if
n
==
addr
=>
{}
// Lost a race to store the same address
_
=>
panic!
(
"attempted to use a condition variable with two mutexes"
),
}
}
}
library/std/src/sys_common/mutex.rs
浏览文件 @
a8c2d4fc
...
...
@@ -72,7 +72,7 @@ pub fn new() -> Self {
Self
(
mutex
)
}
pub
(
crate
)
fn
raw
(
&
self
)
->
&
imp
::
Mutex
{
pub
(
super
)
fn
raw
(
&
self
)
->
&
imp
::
Mutex
{
&
self
.0
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录