0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-07-01 00:08:22 +02:00

ircd::ctx: Resolve proper future::state() in when() templates.

This commit is contained in:
Jason Volk 2018-05-05 02:00:11 -07:00
parent 386901f4c2
commit 4cd0570d56
2 changed files with 24 additions and 7 deletions

View file

@ -90,6 +90,9 @@ struct ircd::ctx::future<void>
namespace ircd::ctx namespace ircd::ctx
{ {
template<class T> const shared_state<T> &state(const future<T> &);
template<class T> shared_state<T> &state(future<T> &);
template<class T, template<class T,
class time_point> class time_point>
bool wait_until(const future<T> &, const time_point &, std::nothrow_t); bool wait_until(const future<T> &, const time_point &, std::nothrow_t);
@ -351,3 +354,17 @@ ircd::ctx::wait_until(const future<T> &f,
return wfun(); return wfun();
} }
template<class T>
ircd::ctx::shared_state<T> &
ircd::ctx::state(future<T> &future)
{
return future.state();
}
template<class T>
const ircd::ctx::shared_state<T> &
ircd::ctx::state(const future<T> &future)
{
return future.state();
}

View file

@ -44,7 +44,7 @@ ircd::ctx::when_all(it first,
{ {
[&p](it &f) [&p](it &f)
{ {
f->state().then = [p] state(*f).then = [p]
(shared_state_base &) mutable (shared_state_base &) mutable
{ {
then(p); then(p);
@ -54,7 +54,7 @@ ircd::ctx::when_all(it first,
future<void> ret(p); future<void> ret(p);
for(; first != last; ++first) for(; first != last; ++first)
if(is(first->state(), future_state::PENDING)) if(is(state(*first), future_state::PENDING))
set_then(first); set_then(first);
if(refcount(p.state()) <= 1) if(refcount(p.state()) <= 1)
@ -85,7 +85,7 @@ ircd::ctx::when_any(it first,
if(!p.valid()) if(!p.valid())
return; return;
set(f->state(), future_state::OBSERVED); set(state(*f), future_state::OBSERVED);
p.set_value(f); p.set_value(f);
} }
}; };
@ -95,7 +95,7 @@ ircd::ctx::when_any(it first,
{ {
[&p](it &f) [&p](it &f)
{ {
f->state().then = [p, f] // alloc state(*f).then = [p, f] // alloc
(shared_state_base &) mutable (shared_state_base &) mutable
{ {
then(p, f); then(p, f);
@ -105,15 +105,15 @@ ircd::ctx::when_any(it first,
future<it> ret(p); future<it> ret(p);
for(auto f(first); f != last; ++f) for(auto f(first); f != last; ++f)
if(is(f->state(), future_state::READY)) if(is(state(*f), future_state::READY))
{ {
set(f->state(), future_state::OBSERVED); set(state(*f), future_state::OBSERVED);
p.set_value(f); p.set_value(f);
return ret; return ret;
} }
for(; first != last; ++first) for(; first != last; ++first)
if(is(first->state(), future_state::PENDING)) if(is(state(*first), future_state::PENDING))
set_then(first); set_then(first);
if(refcount(p.state()) <= 1) if(refcount(p.state()) <= 1)