Add a &LoopPin to add_loop_data closures

This way they can use that proof that they're running on the event loop
This commit is contained in:
Alex Crichton
2016-08-24 18:44:47 -07:00
parent d1cd455225
commit e71d509fee
+6 -5
View File
@@ -95,7 +95,7 @@ impl LoopHandle {
/// closure `f`, generate a handle, and then the future will yield it back.
// TODO: more with examples
pub fn add_loop_data<F, A>(&self, f: F) -> AddLoopData<F, A>
where F: FnOnce() -> A + Send + 'static,
where F: FnOnce(&LoopPin) -> A + Send + 'static,
A: 'static,
{
AddLoopData {
@@ -109,18 +109,19 @@ impl LoopHandle {
}
impl<F, A> Future for AddLoopData<F, A>
where F: FnOnce() -> A + Send + 'static,
where F: FnOnce(&LoopPin) -> A + Send + 'static,
A: 'static,
{
type Item = LoopData<A>;
type Error = io::Error;
fn poll(&mut self) -> Poll<LoopData<A>, io::Error> {
let ret = self.inner.poll(|_lp, f| {
Ok(DropBox::new(f()))
let ret = self.inner.poll(|lp, f| {
Ok(DropBox::new(f(&lp.pin())))
}, |f, slot| {
Message::Run(Box::new(move || {
slot.try_produce(Ok(DropBox::new(f()))).ok()
let pin = super::CURRENT_LOOP.with(|lp| lp.pin());
slot.try_produce(Ok(DropBox::new(f(&pin)))).ok()
.expect("add loop data try_produce intereference");
}))
});