use crate::parser::dashu::{Integer, Rational};
use ordered_float::OrderedFloat;
-use tokio::sync::RwLock;
use std::alloc;
use std::cell::UnsafeCell;
use std::net::TcpListener;
use std::ops::{Deref, DerefMut};
use std::ptr;
+use std::sync::RwLock;
#[macro_export]
macro_rules! arena_alloc {
offset: F64Offset,
) -> RcuRef<RawBlock<F64Table>, UnsafeCell<OrderedFloat<f64>>> {
let f64table = global_f64table()
- .blocking_read()
+ .read()
+ .unwrap()
.upgrade()
.expect("We should only be looking up floats while there is a float table");
impl F64Table {
#[inline]
pub fn new() -> Arc<Self> {
- let upgraded = global_f64table().blocking_read().upgrade();
+ let upgraded = global_f64table().read().unwrap().upgrade();
// don't inline upgraded, otherwise temporary will be dropped too late in case of None
if let Some(atom_table) = upgraded {
atom_table
} else {
- let mut guard = global_f64table().blocking_write();
+ let mut guard = global_f64table().write().unwrap();
// try to upgrade again in case we lost the race on the write lock
if let Some(atom_table) = guard.upgrade() {
atom_table
use std::str;
use std::sync::Arc;
use std::sync::Mutex;
+use std::sync::RwLock;
use std::sync::Weak;
use indexmap::IndexSet;
use modular_bitfield::prelude::*;
-use tokio::sync::RwLock;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct Atom {
#[inline(always)]
fn arc_atom_table() -> Option<Arc<AtomTable>> {
- global_atom_table().blocking_read().upgrade()
+ global_atom_table().read().unwrap().upgrade()
}
impl RawBlockTraits for AtomTable {
impl AtomTable {
#[inline]
pub fn new() -> Arc<Self> {
- let upgraded = global_atom_table().blocking_read().upgrade();
+ let upgraded = global_atom_table().read().unwrap().upgrade();
// don't inline upgraded, otherwise temporary will be dropped too late in case of None
if let Some(atom_table) = upgraded {
atom_table
} else {
- let mut guard = global_atom_table().blocking_write();
+ let mut guard = global_atom_table().write().unwrap();
// try to upgrade again in case we lost the race on the write lock
if let Some(atom_table) = guard.upgrade() {
atom_table
ptr::NonNull,
sync::{
atomic::{AtomicPtr, AtomicU8},
- Arc, Weak,
+ Arc, Weak, RwLock
},
};
-use tokio::sync::RwLock;
-
// the epoch counters of all threads that have ever accessed an Rcu
// threads that have finished will have a dangling Weak reference and can be cleand up
// having this be shared between all Rcu's is a tradeof,
// writes will be slower as more epoch counters need to be waited for
// reads should be faster as a thread only needs to register itself once on the first read
//
-static EPOCH_COUNTERS: RwLock<Vec<Weak<AtomicU8>>> = RwLock::const_new(Vec::new());
+static EPOCH_COUNTERS: RwLock<Vec<Weak<AtomicU8>>> = RwLock::new(Vec::new());
thread_local! {
// odd value means the current thread is about to access the active_epoch of an Rcu
let epoch_counter = Arc::new(AtomicU8::new(0));
// register the current threads epoch counter on init
EPOCH_COUNTERS
- .blocking_write()
+ .write()
+ .unwrap()
.push(Arc::downgrade(&epoch_counter));
epoch_counter
});
// - the Rcu itself holds one strong count
let arc = unsafe { ManuallyDrop::new(Arc::from_raw(arc_ptr)) };
- let epochs = EPOCH_COUNTERS.blocking_read().clone();
+ let epochs = EPOCH_COUNTERS.read().unwrap().clone();
let mut epochs = epochs
.into_iter()
.flat_map(|elem| {