File tree 3 files changed +24
-1
lines changed
3 files changed +24
-1
lines changed Original file line number Diff line number Diff line change
1
+ use crate :: arch:: wasm32;
2
+ use crate :: convert:: TryInto ;
3
+ use crate :: sync:: atomic:: AtomicI32 ;
4
+ use crate :: time:: Duration ;
5
+
6
+ pub fn futex_wait ( futex : & AtomicI32 , expected : i32 , timeout : Option < Duration > ) {
7
+ let timeout = timeout. and_then ( |t| t. as_nanos ( ) . try_into ( ) . ok ( ) ) . unwrap_or ( -1 ) ;
8
+ unsafe {
9
+ wasm32:: memory_atomic_wait32 ( futex as * const AtomicI32 as * mut i32 , expected, timeout) ;
10
+ }
11
+ }
12
+
13
+ pub fn futex_wake ( futex : & AtomicI32 ) {
14
+ unsafe {
15
+ wasm32:: memory_atomic_notify ( futex as * const AtomicI32 as * mut i32 , 1 ) ;
16
+ }
17
+ }
Original file line number Diff line number Diff line change @@ -55,6 +55,8 @@ cfg_if::cfg_if! {
55
55
pub mod mutex;
56
56
#[ path = "rwlock_atomics.rs" ]
57
57
pub mod rwlock;
58
+ #[ path = "futex_atomics.rs" ]
59
+ pub mod futex;
58
60
} else {
59
61
#[ path = "../unsupported/condvar.rs" ]
60
62
pub mod condvar;
Original file line number Diff line number Diff line change 1
1
cfg_if:: cfg_if! {
2
- if #[ cfg( any( target_os = "linux" , target_os = "android" ) ) ] {
2
+ if #[ cfg( any(
3
+ target_os = "linux" ,
4
+ target_os = "android" ,
5
+ all( target_arch = "wasm32" , target_feature = "atomics" ) ,
6
+ ) ) ] {
3
7
mod futex;
4
8
pub use futex:: Parker ;
5
9
} else {
You can’t perform that action at this time.
0 commit comments