Make it possible to have unboxed condvars on specific platforms.

This commit keeps all condvars boxed on all platforms, but makes it
trivial to remove the box on some platforms later.
This commit is contained in:
Mara Bos 2020-10-01 01:13:26 +02:00
parent dc81cbdcb1
commit b181f5a923
9 changed files with 18 additions and 2 deletions

View File

@ -15,6 +15,8 @@ pub struct Condvar {
condvar: UnsafeCell<AtomicU32>,
}
pub type MovableCondvar = Box<Condvar>;
unsafe impl Send for Condvar {}
unsafe impl Sync for Condvar {}

View File

@ -14,6 +14,8 @@ pub struct Condvar {
sem2: *const c_void,
}
pub type MovableCondvar = Box<Condvar>;
unsafe impl Send for Condvar {}
unsafe impl Sync for Condvar {}

View File

@ -7,6 +7,8 @@ pub struct Condvar {
inner: SpinMutex<WaitVariable<()>>,
}
pub type MovableCondvar = Box<Condvar>;
impl Condvar {
pub const fn new() -> Condvar {
Condvar { inner: SpinMutex::new(WaitVariable::new(())) }

View File

@ -6,6 +6,8 @@ pub struct Condvar {
inner: UnsafeCell<libc::pthread_cond_t>,
}
pub type MovableCondvar = Box<Condvar>;
unsafe impl Send for Condvar {}
unsafe impl Sync for Condvar {}

View File

@ -3,6 +3,8 @@ use crate::time::Duration;
pub struct Condvar {}
pub type MovableCondvar = Box<Condvar>;
impl Condvar {
pub const fn new() -> Condvar {
Condvar {}

View File

@ -6,6 +6,8 @@ pub struct Condvar {
inner: UnsafeCell<libc::pthread_cond_t>,
}
pub type MovableCondvar = Box<Condvar>;
unsafe impl Send for Condvar {}
unsafe impl Sync for Condvar {}

View File

@ -9,6 +9,8 @@ pub struct Condvar {
cnt: AtomicUsize,
}
pub type MovableCondvar = Box<Condvar>;
// Condition variables are implemented with a simple counter internally that is
// likely to cause spurious wakeups. Blocking on a condition variable will first
// read the value of the internal counter, unlock the given mutex, and then

View File

@ -8,6 +8,8 @@ pub struct Condvar {
inner: UnsafeCell<c::CONDITION_VARIABLE>,
}
pub type MovableCondvar = Box<Condvar>;
unsafe impl Send for Condvar {}
unsafe impl Sync for Condvar {}

View File

@ -9,14 +9,14 @@ type CondvarCheck = <mutex_imp::MovableMutex as check::CondvarCheck>::Check;
/// An OS-based condition variable.
pub struct Condvar {
inner: Box<imp::Condvar>,
inner: imp::MovableCondvar,
check: CondvarCheck,
}
impl Condvar {
/// Creates a new condition variable for use.
pub fn new() -> Self {
let mut c = box imp::Condvar::new();
let mut c = imp::MovableCondvar::from(imp::Condvar::new());
unsafe { c.init() };
Self { inner: c, check: CondvarCheck::new() }
}