Skip to content

Commit 0c5ebf4

Browse files
committed
Use our own AtomicU64 on targets with target_has_atomic less than 64
1 parent 2abf5ca commit 0c5ebf4

File tree

5 files changed

+93
-15
lines changed

5 files changed

+93
-15
lines changed

Diff for: .github/workflows/ci.yml

+35-13
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,44 @@ jobs:
2828
override: true
2929

3030
- name: check
31-
uses: actions-rs/cargo@v1
32-
with:
33-
command: check
34-
args: --all --benches --bins --examples --tests
31+
run: |
32+
cargo check --all --benches --bins --examples --tests
33+
cargo check --features unstable --all --benches --bins --examples --tests
3534
36-
- name: check unstable
37-
uses: actions-rs/cargo@v1
38-
with:
39-
command: check
40-
args: --features unstable --all --benches --bins --examples --tests
35+
- name: test
36+
run: cargo test --all --features unstable
4137

42-
- name: tests
43-
uses: actions-rs/cargo@v1
38+
cross:
39+
name: Cross compile
40+
runs-on: ubuntu-latest
41+
strategy:
42+
matrix:
43+
target:
44+
- i686-unknown-linux-gnu
45+
- powerpc-unknown-linux-gnu
46+
- powerpc64-unknown-linux-gnu
47+
- mips-unknown-linux-gnu
48+
- arm-linux-androideabi
49+
50+
steps:
51+
- uses: actions/checkout@master
52+
53+
- name: Install nightly
54+
uses: actions-rs/toolchain@v1
4455
with:
45-
command: test
46-
args: --all --features unstable
56+
toolchain: nightly
57+
override: true
58+
59+
- name: Install cross
60+
run: cargo install cross
61+
62+
- name: check
63+
run: |
64+
cross check --all --target ${{ matrix.target }}
65+
cross check --all --features unstable --target ${{ matrix.target }}
66+
67+
- name: test
68+
run: cross test --all --features unstable --target ${{ matrix.target }}
4769

4870
check_fmt_and_docs:
4971
name: Checking fmt and docs

Diff for: src/sync/atomic.rs

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
pub(crate) use self::imp::AtomicU64;
2+
3+
// `AtomicU64` can only be used on targets with `target_has_atomic` is 64 or greater.
4+
// Once `cfg_target_has_atomic` feature is stable, we can replace it with
5+
// `#[cfg(target_has_atomic = "64")]`.
6+
// Refs: https://github.com/rust-lang/rust/tree/master/src/librustc_target
7+
#[cfg(not(any(target_arch = "arm", target_arch = "mips", target_arch = "powerpc")))]
8+
mod imp {
9+
pub(crate) use std::sync::atomic::AtomicU64;
10+
}
11+
12+
#[cfg(any(target_arch = "arm", target_arch = "mips", target_arch = "powerpc"))]
13+
mod imp {
14+
use std::sync::atomic::Ordering;
15+
use std::sync::Mutex;
16+
17+
#[derive(Debug)]
18+
pub(crate) struct AtomicU64(Mutex<u64>);
19+
20+
impl AtomicU64 {
21+
pub(crate) fn new(val: u64) -> Self {
22+
Self(Mutex::new(val))
23+
}
24+
25+
pub(crate) fn load(&self, _: Ordering) -> u64 {
26+
*self.0.lock().unwrap()
27+
}
28+
29+
pub(crate) fn fetch_add(&self, val: u64, _: Ordering) -> u64 {
30+
let mut lock = self.0.lock().unwrap();
31+
let prev = *lock;
32+
*lock = prev + val;
33+
prev
34+
}
35+
36+
pub(crate) fn fetch_sub(&self, val: u64, _: Ordering) -> u64 {
37+
let mut lock = self.0.lock().unwrap();
38+
let prev = *lock;
39+
*lock = prev - val;
40+
prev
41+
}
42+
}
43+
}

Diff for: src/sync/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ pub use std::sync::{Arc, Weak};
3535
pub use mutex::{Mutex, MutexGuard};
3636
pub use rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard};
3737

38+
pub(crate) mod atomic;
3839
mod mutex;
3940
mod rwlock;
4041

Diff for: src/task/blocking.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
//! A thread pool for running blocking functions asynchronously.
22
3-
use std::sync::atomic::{AtomicU64, Ordering};
3+
use std::sync::atomic::Ordering;
44
use std::thread;
55
use std::time::Duration;
66

77
use crossbeam_channel::{bounded, Receiver, Sender};
88
use lazy_static::lazy_static;
99

10+
use crate::sync::atomic::AtomicU64;
1011
use crate::task::task::{JoinHandle, Tag};
1112
use crate::utils::abort_on_panic;
1213

1314
const MAX_THREADS: u64 = 10_000;
1415

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")))]
1521
static DYNAMIC_THREAD_COUNT: AtomicU64 = AtomicU64::new(0);
1622

1723
struct Pool {

Diff for: src/task/task.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ use std::i64;
44
use std::mem;
55
use std::num::NonZeroU64;
66
use std::pin::Pin;
7-
use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering};
7+
use std::sync::atomic::{AtomicUsize, Ordering};
88
use std::sync::Arc;
99

1010
use super::task_local;
11+
use crate::sync::atomic::AtomicU64;
1112
use crate::task::{Context, Poll};
1213

1314
/// A handle to a task.
@@ -112,6 +113,11 @@ pub struct TaskId(NonZeroU64);
112113

113114
impl TaskId {
114115
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")))]
115121
static COUNTER: AtomicU64 = AtomicU64::new(1);
116122

117123
let id = COUNTER.fetch_add(1, Ordering::Relaxed);

0 commit comments

Comments
 (0)