autocommit 2022-02-28 00:14:11 CET
This commit is contained in:
parent
db88f2db42
commit
0e9afcbfa5
22 changed files with 1013 additions and 239 deletions
|
|
@ -12,6 +12,7 @@ pub mod linkedlist;
|
|||
pub mod numcell;
|
||||
pub mod ptr_ext;
|
||||
pub mod queue;
|
||||
pub mod run_toplevel;
|
||||
pub mod smallmap;
|
||||
pub mod stack;
|
||||
pub mod tri;
|
||||
|
|
|
|||
38
src/utils/run_toplevel.rs
Normal file
38
src/utils/run_toplevel.rs
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
use crate::async_engine::SpawnedFuture;
|
||||
use crate::{AsyncEngine, AsyncQueue};
|
||||
use std::rc::Rc;
|
||||
|
||||
pub struct RunToplevelFuture {
|
||||
_future: SpawnedFuture<()>,
|
||||
}
|
||||
|
||||
pub struct RunToplevel {
|
||||
queue: AsyncQueue<Box<dyn FnOnce()>>,
|
||||
}
|
||||
|
||||
impl RunToplevel {
|
||||
pub fn install(eng: &Rc<AsyncEngine>) -> (RunToplevelFuture, Rc<RunToplevel>) {
|
||||
let slf = Rc::new(RunToplevel {
|
||||
queue: Default::default(),
|
||||
});
|
||||
let future = eng.spawn({
|
||||
let slf = slf.clone();
|
||||
async move {
|
||||
loop {
|
||||
let f = slf.queue.pop().await;
|
||||
f();
|
||||
}
|
||||
}
|
||||
});
|
||||
let future = RunToplevelFuture { _future: future };
|
||||
(future, slf)
|
||||
}
|
||||
|
||||
pub fn schedule<F: FnOnce() + 'static>(&self, f: F) {
|
||||
self.schedule_dyn(Box::new(f));
|
||||
}
|
||||
|
||||
fn schedule_dyn(&self, f: Box<dyn FnOnce()>) {
|
||||
self.queue.push(f);
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ use std::slice;
|
|||
|
||||
pub trait VecExt<T> {
|
||||
fn split_at_spare_mut_ext(&mut self) -> (&mut [T], &mut [MaybeUninit<T>]);
|
||||
fn split_at_spare_mut_bytes_ext(&mut self) -> (&mut [T], &mut [MaybeUninit<u8>]);
|
||||
}
|
||||
|
||||
impl<T> VecExt<T> for Vec<T> {
|
||||
|
|
@ -20,4 +21,22 @@ impl<T> VecExt<T> for Vec<T> {
|
|||
(initialized, spare)
|
||||
}
|
||||
}
|
||||
|
||||
fn split_at_spare_mut_bytes_ext(&mut self) -> (&mut [T], &mut [MaybeUninit<u8>]) {
|
||||
let (l, r) = self.split_at_spare_mut_ext();
|
||||
unsafe { (l, uapi::as_maybe_uninit_bytes_mut2(r)) }
|
||||
}
|
||||
}
|
||||
|
||||
pub trait UninitVecExt<T> {
|
||||
fn set_len_safe(&mut self, n: usize);
|
||||
}
|
||||
|
||||
impl<T> UninitVecExt<T> for Vec<MaybeUninit<T>> {
|
||||
fn set_len_safe(&mut self, n: usize) {
|
||||
assert!(n <= self.capacity());
|
||||
unsafe {
|
||||
self.set_len(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue