39 #ifndef CGU_TASK_MANAGER_H
40 #define CGU_TASK_MANAGER_H
47 #include <type_traits>
64 virtual const char*
what()
const throw() {
return "TaskError\n";}
396 namespace TaskManagerHelper2 {
398 template <
class Ret,
class FType>
424 template <
class Ret,
class FType>
426 mutable FType functor;
432 template <
class FunctorArg>
446 typedef std::pair<std::unique_ptr<const Callback::Callback>,
447 std::unique_ptr<const Callback::Callback>> QueueItemType;
789 add_task(std::unique_ptr<const Callback::Callback>(task),
790 std::unique_ptr<const Callback::Callback>());
854 void add_task(std::unique_ptr<const Callback::Callback> task,
855 std::unique_ptr<const Callback::Callback> fail);
913 template <
class Task,
914 class =
typename std::enable_if<!std::is_convertible<typename std::remove_reference<Task>::type,
917 add_task(std::unique_ptr<const Callback::Callback>(Callback::lambda<>(std::forward<Task>(task))),
918 std::unique_ptr<const Callback::Callback>());
996 template <
class Task,
class Fail,
997 class =
typename std::enable_if<!std::is_convertible<Task, std::unique_ptr<const Callback::Callback>>::value
998 && !std::is_convertible<Fail, std::unique_ptr<const Callback::Callback>>::value>::type>
1000 std::unique_ptr<const Callback::Callback> task_cb(
1001 Callback::lambda<>(std::forward<Task>(task))
1003 std::unique_ptr<const Callback::Callback> fail_cb(
1004 Callback::lambda<>(std::forward<Fail>(fail))
1006 add_task(std::move(task_cb), std::move(fail_cb));
1083 template <
class Ret,
class... Params,
class... Args,
class T>
1085 Ret (T::*func)(Params...),
1220 template <
class Ret,
class... Params,
class... Args,
class T>
1223 std::unique_ptr<const Cgu::Callback::Callback> fail,
1226 GMainContext* context,
1228 Ret (T::*func)(Params...),
1319 template <
class Ret,
class... Params,
class... Args,
class T>
1321 GMainContext* context,
1323 Ret (T::*func)(Params...),
1325 static_assert(
sizeof...(Args) < 4,
1326 "No greater than three bound arguments can be passed to "
1327 "TaskManager::make_task_when() taking a member function.");
1331 std::unique_ptr<const Cgu::Callback::Callback>(),
1337 std::forward<Args>(args)...);
1396 template <
class Ret,
class... Params,
class... Args,
class T>
1398 Ret (T::*func)(Params...)
const,
1533 template <
class Ret,
class... Params,
class... Args,
class T>
1536 std::unique_ptr<const Cgu::Callback::Callback> fail,
1539 GMainContext* context,
1541 Ret (T::*func)(Params...)
const,
1632 template <
class Ret,
class... Params,
class... Args,
class T>
1634 GMainContext* context,
1636 Ret (T::*func)(Params...)
const,
1638 static_assert(
sizeof...(Args) < 4,
1639 "No greater than three bound arguments can be passed to "
1640 "TaskManager::make_task_when() taking a member function.");
1644 std::unique_ptr<const Cgu::Callback::Callback>(),
1650 std::forward<Args>(args)...);
1706 template <
class Ret,
class... Params,
class... Args>
1839 template <
class Ret,
class... Params,
class... Args>
1842 std::unique_ptr<const Cgu::Callback::Callback> fail,
1845 GMainContext* context,
1846 Ret (*func)(Params...),
1934 template <
class Ret,
class... Params,
class... Args>
1936 GMainContext* context,
1937 Ret (*func)(Params...),
1939 static_assert(
sizeof...(Args) < 5,
1940 "No greater than four bound arguments can be passed to "
1941 "TaskManager::make_task_when() taking a function.");
1945 std::unique_ptr<const Cgu::Callback::Callback>(),
1950 std::forward<Args>(args)...);
2021 template <
class Ret,
class Func>
2027 #ifndef DOXYGEN_PARSING
2028 template <
class Func>
2047 typedef typename std::remove_const<typename std::remove_reference<Func>::type>::type FType;
2052 typedef decltype(f()) Ret;
2056 CbPtr exec_cb(
new TaskManagerHelper2::FunctorResultExec<Ret, FType>(std::forward<Func>(f), ret));
2057 CbPtr do_fail_cb(
Callback::make_ref(&TaskManagerHelper2::FunctorResultWrapper<Ret, FType>::do_fail,
2059 add_task(std::move(exec_cb), std::move(do_fail_cb));
2193 template <
class Ret,
class Func>
2196 std::unique_ptr<const Cgu::Callback::Callback> fail,
2199 GMainContext* context,
2340 template <
class When,
class Fail,
class Func,
2341 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value
2342 && !std::is_convertible<Fail, std::unique_ptr<const Callback::Callback>>::value>::type>
2348 GMainContext* context,
2354 typedef decltype(func()) Ret;
2355 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2356 Callback::lambda<const Ret&>(std::forward<When>(when))
2358 std::unique_ptr<const Callback::Callback> fail_ptr(
2359 Callback::lambda<>(std::forward<Fail>(fail))
2363 std::move(fail_ptr),
2367 std::forward<Func>(func));
2454 template <
class Ret,
class Func>
2456 GMainContext* context,
2460 std::unique_ptr<const Cgu::Callback::Callback>(),
2464 std::forward<Func>(f));
2562 template <
class When,
class Func,
2563 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value>::type>
2565 GMainContext* context,
2571 typedef decltype(func()) Ret;
2572 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2573 Callback::lambda<const Ret&>(std::forward<When>(when))
2577 std::unique_ptr<const Cgu::Callback::Callback>(),
2581 std::forward<Func>(func));
2669 template <
class Ret,
class Func>
2671 GMainContext* context,
2675 std::unique_ptr<const Cgu::Callback::Callback>(),
2679 std::forward<Func>(f));
2779 template <
class Func,
class When,
2780 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value>::type>
2782 GMainContext* context,
2788 typedef decltype(func()) Ret;
2789 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2790 Callback::lambda<const Ret&>(std::forward<When>(when))
2794 std::unique_ptr<const Cgu::Callback::Callback>(),
2798 std::forward<Func>(func));
2863 template <
class Func>
2876 typedef decltype(f()) Ret;
2878 std::packaged_task<Ret()> task{std::forward<Func>(f)};
2879 std::future<Ret> ret{task.get_future()};
3010 template <
class When,
class Func>
3014 GMainContext* context,
3106 template <
class When,
class Func>
3108 GMainContext* context,
3114 std::forward<Func>(func));
3209 template <
class When,
class Func>
3211 GMainContext* context,
3217 std::forward<Func>(func));
3265 TaskManager(
unsigned int max = 8,
unsigned int min = 0,
3266 unsigned int idle = 10000,
bool blocking =
true,
3408 #include <c++-gtk-utils/task_manager.tpp>
unsigned int get_min_threads() const
StopMode
Definition: task_manager.h:443
unsigned int get_tasks() const
void add_task(const Callback::Callback *task)
Definition: task_manager.h:788
void make_task_packaged_compose(Func &&func, GMainContext *context, When &&when)
Definition: task_manager.h:3210
void make_task_compose(Func &&f, GMainContext *context, std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when)
Definition: task_manager.h:2670
A thread-pool class for managing tasks in multi-threaded programs.
Definition: task_manager.h:441
void make_task_when(When &&when, GMainContext *context, Func &&func)
Definition: task_manager.h:2564
CallbackArg< FreeArgs...> * make_ref(T &t, void(T::*func)(FreeArgs...))
Definition: callback.h:1358
Definition: task_manager.h:63
virtual const char * what() const
Definition: task_manager.h:64
void make_task_when(std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, GMainContext *context, const T &t, Ret(T::*func)(Params...) const, Args &&...args)
Definition: task_manager.h:1633
This file provides thread-safe asynchronous queue classes.
static void exec(FType &f, const SharedLockPtr< AsyncResult< Ret >> &ret)
Definition: task_manager.h:400
void make_task_when(std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, GMainContext *context, Ret(*func)(Params...), Args &&...args)
Definition: task_manager.h:1935
void dispatch() const
Definition: task_manager.h:429
This is a smart pointer for managing the lifetime of objects allocated on freestore, with a thread safe reference count.
Definition: shared_ptr.h:644
static void do_fail(const SharedLockPtr< AsyncResult< Ret >> &ret)
Definition: task_manager.h:404
void make_task_compose(Func &&func, GMainContext *context, When &&when)
Definition: task_manager.h:2781
void set_max_threads(unsigned int max)
Cgu::SharedLockPtr< Cgu::AsyncResult< Ret > > make_task_result(T &t, Ret(T::*func)(Params...), Args &&...args)
void set_blocking(bool blocking)
unsigned int get_idle_time() const
A scoped handle for exception safe incrementing of the maximum number of threads that a TaskManager o...
Definition: task_manager.h:3344
void make_task_when(std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, GMainContext *context, Func &&f)
Definition: task_manager.h:2455
void make_task_packaged_when(When &&when, Cgu::Releaser *when_releaser, gint priority, GMainContext *context, Func &&func)
This file provides classes for type erasure.
TaskManager & operator=(const TaskManager &)=delete
void add_task(Task &&task, Fail &&fail)
Definition: task_manager.h:999
FunctorResultExec(FunctorArg &&functor_, const SharedLockPtr< AsyncResult< Ret >> &ret_)
Definition: task_manager.h:433
void make_task_when_full(When &&when, Cgu::Releaser *when_releaser, Fail &&fail, Cgu::Releaser *fail_releaser, gint priority, GMainContext *context, Func &&func)
Definition: task_manager.h:2343
void make_task_when_full(std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, Cgu::Releaser *when_releaser, std::unique_ptr< const Cgu::Callback::Callback > fail, Cgu::Releaser *fail_releaser, gint priority, GMainContext *context, T &t, Ret(T::*func)(Params...), Args &&...args)
Definition: task_manager.h:399
void make_task_when(std::unique_ptr< const Cgu::Callback::CallbackArg< const Ret & >> when, GMainContext *context, T &t, Ret(T::*func)(Params...), Args &&...args)
Definition: task_manager.h:1320
Definition: task_manager.h:425
A thread-safe asynchronous result class.
Definition: async_result.h:165
IncHandle(TaskManager &tm_)
Definition: task_manager.h:3390
void add_task(Task &&task)
Definition: task_manager.h:916
void set_stop_mode(StopMode mode)
void make_task_packaged_when(When &&when, GMainContext *context, Func &&func)
Definition: task_manager.h:3107
unsigned int get_max_threads() const
unsigned int get_used_threads() const
This file provides a thread-safe signal/slot mechanism, with automatic disconnection.
Provides wrapper classes for pthread mutexes and condition variables, and scoped locking classes for ...
Definition: application.h:44
auto make_task_packaged(Func &&f) -> std::future< decltype(f())>
Definition: task_manager.h:2864
StopMode get_stop_mode() const
A scoped locking class for exception safe Mutex locking which tracks the status of its mutex...
Definition: mutex.h:331
This file provides a thread-safe asynchronous result class.
Definition: task_manager.h:443
void change_max_threads(int delta)
void set_idle_time(unsigned int idle)
~IncHandle()
Definition: task_manager.h:3401
TaskManager(const TaskManager &)=delete
CallbackArg Callback
Definition: callback.h:567
Definition: task_manager.h:443
bool get_blocking() const
The callback interface class.
Definition: callback.h:567
#define CGU_GLIB_MEMORY_SLICES_FUNCS
Definition: cgu_config.h:84
A class used for tracking EmitterArg and SafeEmitterArg connections.
Definition: emitter.h:352