forked from OctaForge/libostd
make full spawn/make_channel methods on base scheduler
This commit is contained in:
parent
a1974ddf45
commit
f79236e94f
|
@ -30,6 +30,24 @@ struct scheduler {
|
||||||
virtual void spawn(std::function<void()>) = 0;
|
virtual void spawn(std::function<void()>) = 0;
|
||||||
virtual void yield() = 0;
|
virtual void yield() = 0;
|
||||||
virtual generic_condvar make_condition() = 0;
|
virtual generic_condvar make_condition() = 0;
|
||||||
|
|
||||||
|
template<typename F, typename ...A>
|
||||||
|
void spawn(F &&func, A &&...args) {
|
||||||
|
if constexpr(sizeof...(A) == 0) {
|
||||||
|
spawn(std::function<void()>{func});
|
||||||
|
} else {
|
||||||
|
spawn(std::function<void()>{
|
||||||
|
std::bind(std::forward<F>(func), std::forward<A>(args)...)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
channel<T> make_channel() {
|
||||||
|
return channel<T>{[this]() {
|
||||||
|
return make_condition();
|
||||||
|
}};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
@ -547,41 +565,20 @@ using coroutine_scheduler =
|
||||||
using protected_coroutine_scheduler =
|
using protected_coroutine_scheduler =
|
||||||
basic_coroutine_scheduler<stack_traits, true>;
|
basic_coroutine_scheduler<stack_traits, true>;
|
||||||
|
|
||||||
template<typename F, typename ...A>
|
|
||||||
inline void spawn(scheduler &sched, F &&func, A &&...args) {
|
|
||||||
if constexpr(sizeof...(A) == 0) {
|
|
||||||
sched.spawn(std::forward<F>(func));
|
|
||||||
} else {
|
|
||||||
sched.spawn(std::bind(std::forward<F>(func), std::forward<A>(args)...));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename F, typename ...A>
|
template<typename F, typename ...A>
|
||||||
inline void spawn(F &&func, A &&...args) {
|
inline void spawn(F &&func, A &&...args) {
|
||||||
spawn(
|
detail::current_scheduler->spawn(
|
||||||
*detail::current_scheduler,
|
|
||||||
std::forward<F>(func), std::forward<A>(args)...
|
std::forward<F>(func), std::forward<A>(args)...
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void yield(scheduler &sched) {
|
|
||||||
sched.yield();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void yield() {
|
inline void yield() {
|
||||||
detail::current_scheduler->yield();
|
detail::current_scheduler->yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
inline channel<T> make_channel(scheduler &sched) {
|
|
||||||
return channel<T>{[&sched]() {
|
|
||||||
return sched.make_condition();
|
|
||||||
}};
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline channel<T> make_channel() {
|
inline channel<T> make_channel() {
|
||||||
return make_channel<T>(*detail::current_scheduler);
|
return detail::current_scheduler->make_channel<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
} /* namespace ostd */
|
} /* namespace ostd */
|
||||||
|
|
Loading…
Reference in a new issue