File tree 5 files changed +92
-15
lines changed
5 files changed +92
-15
lines changed Original file line number Diff line number Diff line change @@ -26,22 +26,44 @@ jobs:
26
26
override : true
27
27
28
28
- name : check
29
- uses : actions-rs/cargo@v1
30
- with :
31
- command : check
32
- args : --all --benches --bins --examples --tests
29
+ run : |
30
+ cargo check --all --benches --bins --examples --tests
31
+ cargo check --features unstable --all --benches --bins --examples --tests
33
32
34
- - name : check unstable
35
- uses : actions-rs/cargo@v1
36
- with :
37
- command : check
38
- args : --features unstable --all --benches --bins --examples --tests
33
+ - name : test
34
+ run : cargo test --all --features unstable
39
35
40
- - name : tests
41
- uses : actions-rs/cargo@v1
36
+ cross :
37
+ name : Cross compile
38
+ runs-on : ubuntu-latest
39
+ strategy :
40
+ matrix :
41
+ target :
42
+ - i686-unknown-linux-gnu
43
+ - powerpc-unknown-linux-gnu
44
+ - powerpc64-unknown-linux-gnu
45
+ - mips-unknown-linux-gnu
46
+ - arm-linux-androideabi
47
+
48
+ steps :
49
+ - uses : actions/checkout@master
50
+
51
+ - name : Install nightly
52
+ uses : actions-rs/toolchain@v1
42
53
with :
43
- command : test
44
- args : --all --features unstable
54
+ toolchain : nightly
55
+ override : true
56
+
57
+ - name : Install cross
58
+ run : cargo install cross
59
+
60
+ - name : check
61
+ run : |
62
+ cross check --all --target ${{ matrix.target }}
63
+ cross check --all --features unstable --target ${{ matrix.target }}
64
+
65
+ - name : test
66
+ run : cross test --all --features unstable --target ${{ matrix.target }}
45
67
46
68
check_fmt_and_docs :
47
69
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
+
6
+ #[ cfg( not( any( target_arch = "arm" , target_arch = "mips" , target_arch = "powerpc" ) ) ) ]
7
+ mod imp {
8
+ pub ( crate ) use std:: sync:: atomic:: AtomicU64 ;
9
+ }
10
+
11
+ #[ cfg( any( target_arch = "arm" , target_arch = "mips" , target_arch = "powerpc" ) ) ]
12
+ mod imp {
13
+ use std:: sync:: atomic:: Ordering ;
14
+ use std:: sync:: Mutex ;
15
+
16
+ #[ derive( Debug ) ]
17
+ pub ( crate ) struct AtomicU64 ( Mutex < u64 > ) ;
18
+
19
+ impl AtomicU64 {
20
+ pub ( crate ) fn new ( val : u64 ) -> Self {
21
+ Self ( Mutex :: new ( val) )
22
+ }
23
+
24
+ pub ( crate ) fn load ( & self , _: Ordering ) -> u64 {
25
+ * self . 0 . lock ( ) . unwrap ( )
26
+ }
27
+
28
+ pub ( crate ) fn fetch_add ( & self , val : u64 , _: Ordering ) -> u64 {
29
+ let mut lock = self . 0 . lock ( ) . unwrap ( ) ;
30
+ let prev = * lock;
31
+ * lock = prev + val;
32
+ prev
33
+ }
34
+
35
+ pub ( crate ) fn fetch_sub ( & self , val : u64 , _: Ordering ) -> u64 {
36
+ let mut lock = self . 0 . lock ( ) . unwrap ( ) ;
37
+ let prev = * lock;
38
+ * lock = prev - val;
39
+ prev
40
+ }
41
+ }
42
+ }
Original file line number Diff line number Diff line change @@ -35,6 +35,7 @@ pub use std::sync::{Arc, Weak};
35
35
pub use mutex:: { Mutex , MutexGuard } ;
36
36
pub use rwlock:: { RwLock , RwLockReadGuard , RwLockWriteGuard } ;
37
37
38
+ pub ( crate ) mod atomic;
38
39
mod mutex;
39
40
mod rwlock;
40
41
Original file line number Diff line number Diff line change 1
1
//! A thread pool for running blocking functions asynchronously.
2
2
3
- use std:: sync:: atomic:: { AtomicU64 , Ordering } ;
3
+ use std:: sync:: atomic:: Ordering ;
4
4
use std:: thread;
5
5
use std:: time:: Duration ;
6
6
7
7
use crossbeam_channel:: { bounded, Receiver , Sender } ;
8
8
use lazy_static:: lazy_static;
9
9
10
+ use crate :: sync:: atomic:: AtomicU64 ;
10
11
use crate :: task:: task:: { JoinHandle , Tag } ;
11
12
use crate :: utils:: abort_on_panic;
12
13
13
14
const MAX_THREADS : u64 = 10_000 ;
14
15
16
+ #[ cfg( any( target_arch = "arm" , target_arch = "mips" , target_arch = "powerpc" ) ) ]
17
+ lazy_static ! {
18
+ static ref DYNAMIC_THREAD_COUNT : AtomicU64 = AtomicU64 :: new( 0 ) ;
19
+ }
20
+ #[ cfg( not( any( target_arch = "arm" , target_arch = "mips" , target_arch = "powerpc" ) ) ) ]
15
21
static DYNAMIC_THREAD_COUNT : AtomicU64 = AtomicU64 :: new ( 0 ) ;
16
22
17
23
struct Pool {
Original file line number Diff line number Diff line change @@ -4,10 +4,11 @@ use std::i64;
4
4
use std:: mem;
5
5
use std:: num:: NonZeroU64 ;
6
6
use std:: pin:: Pin ;
7
- use std:: sync:: atomic:: { AtomicU64 , AtomicUsize , Ordering } ;
7
+ use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
8
8
use std:: sync:: Arc ;
9
9
10
10
use super :: task_local;
11
+ use crate :: sync:: atomic:: AtomicU64 ;
11
12
use crate :: task:: { Context , Poll } ;
12
13
13
14
/// A handle to a task.
@@ -112,6 +113,11 @@ pub struct TaskId(NonZeroU64);
112
113
113
114
impl TaskId {
114
115
pub ( crate ) fn new ( ) -> TaskId {
116
+ #[ cfg( any( target_arch = "arm" , target_arch = "mips" , target_arch = "powerpc" ) ) ]
117
+ lazy_static:: lazy_static! {
118
+ static ref COUNTER : AtomicU64 = AtomicU64 :: new( 1 ) ;
119
+ }
120
+ #[ cfg( not( any( target_arch = "arm" , target_arch = "mips" , target_arch = "powerpc" ) ) ) ]
115
121
static COUNTER : AtomicU64 = AtomicU64 :: new ( 1 ) ;
116
122
117
123
let id = COUNTER . fetch_add ( 1 , Ordering :: Relaxed ) ;
You can’t perform that action at this time.
0 commit comments