1
0
Fork 0
forked from wry/wry

autocommit 2022-02-28 00:14:11 CET

This commit is contained in:
Julian Orth 2022-02-28 00:14:11 +01:00
parent db88f2db42
commit 0e9afcbfa5
22 changed files with 1013 additions and 239 deletions

View file

@ -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
View 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);
}
}

View file

@ -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);
}
}
}