From 5d9295786b02f0d1ae1f3963b3be648a670b95db Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Sat, 5 Nov 2016 11:26:24 -0700 Subject: [PATCH] Use a "small vec" in `Events` Right now just specialize one element as that's the same size as a vector, but we can consider adding more later. Closes #203 --- src/task_impl/mod.rs | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/task_impl/mod.rs b/src/task_impl/mod.rs index f5e52aeb8e2..53011b10d98 100644 --- a/src/task_impl/mod.rs +++ b/src/task_impl/mod.rs @@ -208,25 +208,37 @@ pub trait EventSet: Send + Sync + 'static { // A collection of UnparkEvents to trigger on `unpark` #[derive(Clone)] -struct Events { - set: Vec, // TODO: change to some SmallVec +enum Events { + Zero, + One(UnparkEvent), + Lots(Vec), } impl Events { fn new() -> Events { - Events { set: Vec::new() } + Events::Zero } fn trigger(&self) { - for event in self.set.iter() { - event.set.insert(event.item) + match *self { + Events::Zero => {} + Events::One(ref event) => event.set.insert(event.item), + Events::Lots(ref list) => { + for event in list { + event.set.insert(event.item); + } + } } } fn with_event(&self, event: UnparkEvent) -> Events { - let mut set = self.set.clone(); - set.push(event); - Events { set: set } + let mut list = match *self { + Events::Zero => return Events::One(event), + Events::One(ref event) => vec![event.clone()], + Events::Lots(ref list) => list.clone(), + }; + list.push(event); + Events::Lots(list) } }