non-template spawn
This commit is contained in:
parent
d73ad08e87
commit
147b8d8042
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue