mirror of
https://github.com/fafhrd91/actix-net
synced 2024-12-18 08:03:11 +01:00
Add arbiter specific storage
This commit is contained in:
parent
1a644c6bb1
commit
94e673b50b
@ -1,5 +1,12 @@
|
|||||||
# Changes
|
# Changes
|
||||||
|
|
||||||
|
## [0.2.5] - 2019-09-02
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
* Add arbiter specific storage
|
||||||
|
|
||||||
|
|
||||||
## [0.2.4] - 2019-07-17
|
## [0.2.4] - 2019-07-17
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "actix-rt"
|
name = "actix-rt"
|
||||||
version = "0.2.4"
|
version = "0.2.5"
|
||||||
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
authors = ["Nikolay Kim <fafhrd91@gmail.com>"]
|
||||||
description = "Actix runtime"
|
description = "Actix runtime"
|
||||||
keywords = ["network", "framework", "async", "futures"]
|
keywords = ["network", "framework", "async", "futures"]
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
use std::any::{Any, TypeId};
|
||||||
use std::cell::{Cell, RefCell};
|
use std::cell::{Cell, RefCell};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
@ -17,6 +18,7 @@ thread_local!(
|
|||||||
static ADDR: RefCell<Option<Arbiter>> = RefCell::new(None);
|
static ADDR: RefCell<Option<Arbiter>> = RefCell::new(None);
|
||||||
static RUNNING: Cell<bool> = Cell::new(false);
|
static RUNNING: Cell<bool> = Cell::new(false);
|
||||||
static Q: RefCell<Vec<Box<dyn Future<Item = (), Error = ()>>>> = RefCell::new(Vec::new());
|
static Q: RefCell<Vec<Box<dyn Future<Item = (), Error = ()>>>> = RefCell::new(Vec::new());
|
||||||
|
static STORAGE: RefCell<HashMap<TypeId, Box<dyn Any>>> = RefCell::new(HashMap::new());
|
||||||
);
|
);
|
||||||
|
|
||||||
pub(crate) static COUNT: AtomicUsize = AtomicUsize::new(0);
|
pub(crate) static COUNT: AtomicUsize = AtomicUsize::new(0);
|
||||||
@ -56,6 +58,7 @@ impl Arbiter {
|
|||||||
let arb = Arbiter(tx);
|
let arb = Arbiter(tx);
|
||||||
ADDR.with(|cell| *cell.borrow_mut() = Some(arb.clone()));
|
ADDR.with(|cell| *cell.borrow_mut() = Some(arb.clone()));
|
||||||
RUNNING.with(|cell| cell.set(false));
|
RUNNING.with(|cell| cell.set(false));
|
||||||
|
STORAGE.with(|cell| cell.borrow_mut().clear());
|
||||||
Arbiter::spawn(ArbiterController { stop: None, rx });
|
Arbiter::spawn(ArbiterController { stop: None, rx });
|
||||||
|
|
||||||
arb
|
arb
|
||||||
@ -90,6 +93,7 @@ impl Arbiter {
|
|||||||
|
|
||||||
let (stop, stop_rx) = channel();
|
let (stop, stop_rx) = channel();
|
||||||
RUNNING.with(|cell| cell.set(true));
|
RUNNING.with(|cell| cell.set(true));
|
||||||
|
STORAGE.with(|cell| cell.borrow_mut().clear());
|
||||||
|
|
||||||
System::set_current(sys);
|
System::set_current(sys);
|
||||||
|
|
||||||
@ -202,6 +206,50 @@ impl Arbiter {
|
|||||||
})));
|
})));
|
||||||
rx
|
rx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set item to arbiter storage
|
||||||
|
pub fn set_item<T: 'static>(item: T) {
|
||||||
|
STORAGE.with(move |cell| cell.borrow_mut().insert(TypeId::of::<T>(), Box::new(item)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check if arbiter storage contains item
|
||||||
|
pub fn contains_item<T: 'static>() -> bool {
|
||||||
|
STORAGE.with(move |cell| cell.borrow().get(&TypeId::of::<T>()).is_some())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get a reference to a type previously inserted on this arbiter's storage.
|
||||||
|
///
|
||||||
|
/// Panics is item is not inserted
|
||||||
|
pub fn get_item<T: 'static, F, R>(mut f: F) -> R
|
||||||
|
where
|
||||||
|
F: FnMut(&T) -> R,
|
||||||
|
{
|
||||||
|
STORAGE.with(move |cell| {
|
||||||
|
let st = cell.borrow();
|
||||||
|
let item = st
|
||||||
|
.get(&TypeId::of::<T>())
|
||||||
|
.and_then(|boxed| (&**boxed as &(dyn Any + 'static)).downcast_ref())
|
||||||
|
.unwrap();
|
||||||
|
f(item)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get a mutable reference to a type previously inserted on this arbiter's storage.
|
||||||
|
///
|
||||||
|
/// Panics is item is not inserted
|
||||||
|
pub fn get_mut_item<T: 'static, F, R>(mut f: F) -> R
|
||||||
|
where
|
||||||
|
F: FnMut(&mut T) -> R,
|
||||||
|
{
|
||||||
|
STORAGE.with(move |cell| {
|
||||||
|
let mut st = cell.borrow_mut();
|
||||||
|
let item = st
|
||||||
|
.get_mut(&TypeId::of::<T>())
|
||||||
|
.and_then(|boxed| (&mut **boxed as &mut (dyn Any + 'static)).downcast_mut())
|
||||||
|
.unwrap();
|
||||||
|
f(item)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ArbiterController {
|
struct ArbiterController {
|
||||||
|
Loading…
Reference in New Issue
Block a user