File tree 5 files changed +97
-17
lines changed
5 files changed +97
-17
lines changed Original file line number Diff line number Diff line change @@ -18,22 +18,44 @@ jobs:
18
18
override : true
19
19
20
20
- name : check
21
- uses : actions-rs/cargo@v1
22
- with :
23
- command : check
24
- args : --all --benches --bins --examples --tests
21
+ run : |
22
+ cargo check --all --benches --bins --examples --tests
23
+ cargo check --features unstable --all --benches --bins --examples --tests
25
24
26
- - name : check unstable
27
- uses : actions-rs/cargo@v1
28
- with :
29
- command : check
30
- args : --features unstable --all --benches --bins --examples --tests
25
+ - name : test
26
+ run : cargo test --all --features unstable
27
+
28
+ cross :
29
+ name : Cross compile
30
+ runs-on : ubuntu-latest
31
+ strategy :
32
+ matrix :
33
+ target :
34
+ - i686-unknown-linux-gnu
35
+ - powerpc-unknown-linux-gnu
36
+ - powerpc64-unknown-linux-gnu
37
+ - mips-unknown-linux-gnu
38
+ - arm-linux-androideabi
39
+
40
+ steps :
41
+ - uses : actions/checkout@master
31
42
32
- - name : tests
33
- uses : actions-rs/cargo @v1
43
+ - name : Install nightly
44
+ uses : actions-rs/toolchain @v1
34
45
with :
35
- command : test
36
- args : --all --doc --features unstable
46
+ toolchain : nightly
47
+ override : true
48
+
49
+ - name : Install cross
50
+ run : cargo install cross
51
+
52
+ - name : check
53
+ run : |
54
+ cross check --all --target ${{ matrix.target }}
55
+ cross check --all --features unstable --target ${{ matrix.target }}
56
+
57
+ - name : test
58
+ run : cross test --all --features unstable --target ${{ matrix.target }}
37
59
38
60
check_fmt_and_docs :
39
61
name : Checking fmt and docs
Original file line number Diff line number Diff line change
1
+ // `AtomicU64` can only be used on targets with `target_has_atomic` is 64 or greater.
2
+ // Once `cfg_target_has_atomic` feature is stable, we can replace it with
3
+ // `#[cfg(target_has_atomic = "64")]`.
4
+ // Refs: https://github.com/rust-lang/rust/tree/master/src/librustc_target
5
+ cfg_if:: cfg_if! {
6
+ if #[ cfg( not( any( target_arch = "arm" , target_arch = "mips" , target_arch = "powerpc" ) ) ) ] {
7
+ pub ( crate ) use std:: sync:: atomic:: AtomicU64 ;
8
+ } else {
9
+ use std:: sync:: atomic:: Ordering ;
10
+ use std:: sync:: Mutex ;
11
+
12
+ #[ derive( Debug ) ]
13
+ pub ( crate ) struct AtomicU64 ( Mutex <u64 >) ;
14
+
15
+ impl AtomicU64 {
16
+ pub ( crate ) fn new( val: u64 ) -> Self {
17
+ Self ( Mutex :: new( val) )
18
+ }
19
+
20
+ pub ( crate ) fn load( & self , _: Ordering ) -> u64 {
21
+ * self . 0 . lock( ) . unwrap( )
22
+ }
23
+
24
+ pub ( crate ) fn fetch_add( & self , val: u64 , _: Ordering ) -> u64 {
25
+ let mut lock = self . 0 . lock( ) . unwrap( ) ;
26
+ let prev = * lock;
27
+ * lock = prev + val;
28
+ prev
29
+ }
30
+
31
+ pub ( crate ) fn fetch_sub( & self , val: u64 , _: Ordering ) -> u64 {
32
+ let mut lock = self . 0 . lock( ) . unwrap( ) ;
33
+ let prev = * lock;
34
+ * lock = prev - val;
35
+ prev
36
+ }
37
+ }
38
+ }
39
+ }
Original file line number Diff line number Diff line change @@ -38,6 +38,7 @@ pub use barrier::{Barrier, BarrierWaitResult};
38
38
pub use mutex:: { Mutex , MutexGuard } ;
39
39
pub use rwlock:: { RwLock , RwLockReadGuard , RwLockWriteGuard } ;
40
40
41
+ pub ( crate ) mod atomic;
41
42
#[ cfg( any( feature = "unstable" , feature = "docs" ) ) ]
42
43
#[ cfg_attr( feature = "docs" , doc( cfg( unstable) ) ) ]
43
44
mod barrier;
Original file line number Diff line number Diff line change 2
2
3
3
use std:: fmt;
4
4
use std:: pin:: Pin ;
5
- use std:: sync:: atomic:: { AtomicU64 , Ordering } ;
5
+ use std:: sync:: atomic:: Ordering ;
6
6
use std:: thread;
7
7
use std:: time:: Duration ;
8
8
9
9
use crossbeam_channel:: { bounded, Receiver , Sender } ;
10
10
use lazy_static:: lazy_static;
11
11
12
12
use crate :: future:: Future ;
13
+ use crate :: sync:: atomic:: AtomicU64 ;
13
14
use crate :: task:: { Context , Poll } ;
14
15
use crate :: utils:: abort_on_panic;
15
16
16
17
const MAX_THREADS : u64 = 10_000 ;
17
18
18
- static DYNAMIC_THREAD_COUNT : AtomicU64 = AtomicU64 :: new ( 0 ) ;
19
+ cfg_if:: cfg_if! {
20
+ if #[ cfg( any( target_arch = "arm" , target_arch = "mips" , target_arch = "powerpc" ) ) ] {
21
+ lazy_static! {
22
+ static ref DYNAMIC_THREAD_COUNT : AtomicU64 = AtomicU64 :: new( 0 ) ;
23
+ }
24
+ } else {
25
+ static DYNAMIC_THREAD_COUNT : AtomicU64 = AtomicU64 :: new( 0 ) ;
26
+ }
27
+ }
19
28
20
29
struct Pool {
21
30
sender : Sender < async_task:: Task < ( ) > > ,
Original file line number Diff line number Diff line change @@ -3,11 +3,12 @@ use std::i64;
3
3
use std:: mem;
4
4
use std:: num:: NonZeroU64 ;
5
5
use std:: pin:: Pin ;
6
- use std:: sync:: atomic:: { AtomicU64 , AtomicUsize , Ordering } ;
6
+ use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
7
7
use std:: sync:: Arc ;
8
8
9
9
use super :: task_local;
10
10
use crate :: future:: Future ;
11
+ use crate :: sync:: atomic:: AtomicU64 ;
11
12
use crate :: task:: { Context , Poll } ;
12
13
13
14
/// A handle to a task.
@@ -112,7 +113,15 @@ pub struct TaskId(NonZeroU64);
112
113
113
114
impl TaskId {
114
115
pub ( crate ) fn new ( ) -> TaskId {
115
- static COUNTER : AtomicU64 = AtomicU64 :: new ( 1 ) ;
116
+ cfg_if:: cfg_if! {
117
+ if #[ cfg( any( target_arch = "arm" , target_arch = "mips" , target_arch = "powerpc" ) ) ] {
118
+ lazy_static:: lazy_static! {
119
+ static ref COUNTER : AtomicU64 = AtomicU64 :: new( 1 ) ;
120
+ }
121
+ } else {
122
+ static COUNTER : AtomicU64 = AtomicU64 :: new( 1 ) ;
123
+ }
124
+ }
116
125
117
126
let id = COUNTER . fetch_add ( 1 , Ordering :: Relaxed ) ;
118
127
You can’t perform that action at this time.
0 commit comments