non-template spawn

master
Daniel Kolesa 2017-03-23 10:56:21 +01:00
parent d73ad08e87
commit 147b8d8042
1 changed files with 14 additions and 29 deletions

View File

@ -29,18 +29,14 @@ struct thread_scheduler {
return func(std::forward<A>(args)...); return func(std::forward<A>(args)...);
} }
template<typename F, typename ...A> void spawn(std::function<void()> func) {
void spawn(F func, A &&...args) {
std::lock_guard<std::mutex> l{p_lock}; std::lock_guard<std::mutex> l{p_lock};
p_threads.emplace_front(); p_threads.emplace_front();
auto it = p_threads.begin(); auto it = p_threads.begin();
*it = std::thread{ *it = std::thread{[this, it, lfunc = std::move(func)]() {
[this, it](auto func, auto ...args) { lfunc();
func(std::move(args)...); remove_thread(it);
remove_thread(it); }};
},
std::move(func), std::forward<A>(args)...
};
} }
void yield() { void yield() {
@ -195,19 +191,8 @@ public:
} }
} }
template<typename F, typename ...A> void spawn(std::function<void()> func) {
void spawn(F func, A &&...args) { p_coros.emplace_back(std::move(func), p_stacks.get_allocator());
if constexpr(sizeof...(A) == 0) {
p_coros.emplace_back([lfunc = std::move(func)]() {
lfunc();
}, p_stacks.get_allocator());
} else {
p_coros.emplace_back([lfunc = std::bind(
std::move(func), std::forward<A>(args)...
)]() mutable {
lfunc();
}, p_stacks.get_allocator());
}
} }
void yield() { void yield() {
@ -382,14 +367,10 @@ public:
} }
} }
template<typename F, typename ...A> void spawn(std::function<void()> func) {
void spawn(F func, A &&...args) {
{ {
std::lock_guard<std::mutex> l{p_lock}; std::lock_guard<std::mutex> l{p_lock};
spawn_add( spawn_add(p_stacks.get_allocator(), std::move(func));
p_stacks.get_allocator(), std::move(func),
std::forward<A>(args)...
);
} }
p_cond.notify_one(); p_cond.notify_one();
} }
@ -531,7 +512,11 @@ using protected_coroutine_scheduler =
template<typename S, typename F, typename ...A> template<typename S, typename F, typename ...A>
inline void spawn(S &sched, F &&func, A &&...args) { inline void spawn(S &sched, F &&func, A &&...args) {
sched.spawn(std::forward<F>(func), std::forward<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 S> template<typename S>