diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2022-02-22 17:03:21 +0100 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2022-02-22 17:03:21 +0100 |
commit | 619def44c1cca9f3cdf63544d5f24f2c7a7d9b77 (patch) | |
tree | 01868de723cb82c86842f33743fa7b14e24c1fa3 /src/buildtool/multithreading/task.hpp | |
download | justbuild-619def44c1cca9f3cdf63544d5f24f2c7a7d9b77.tar.gz |
Initial self-hosting commit
This is the initial version of our tool that is able to
build itself. In can be bootstrapped by
./bin/bootstrap.py
Co-authored-by: Oliver Reiche <oliver.reiche@huawei.com>
Co-authored-by: Victor Moreno <victor.moreno1@huawei.com>
Diffstat (limited to 'src/buildtool/multithreading/task.hpp')
-rw-r--r-- | src/buildtool/multithreading/task.hpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/buildtool/multithreading/task.hpp b/src/buildtool/multithreading/task.hpp new file mode 100644 index 00000000..49eb20a9 --- /dev/null +++ b/src/buildtool/multithreading/task.hpp @@ -0,0 +1,38 @@ +#ifndef INCLUDED_SRC_BUILDTOOL_MULTITHREADING_TASK_HPP +#define INCLUDED_SRC_BUILDTOOL_MULTITHREADING_TASK_HPP + +#include <functional> +#include <type_traits> + +class Task { + public: + using TaskFunc = std::function<void()>; + + Task() noexcept = default; + + // NOLINTNEXTLINE(modernize-pass-by-value) + explicit Task(TaskFunc const& function) noexcept : f_{function} {} + explicit Task(TaskFunc&& function) noexcept : f_{std::move(function)} {} + + void operator()() { f_(); } + + // To be able to discern whether the internal f_ has been set or not, + // allowing us to write code such as: + /* + Task t; + while (!t) { + t = TryGetTaskFromQueue(); // (*) + } + t(); // (**) + */ + // (*) does `return Task();` or `return {};` if queue is empty or locked) + // (**) we can now surely execute the task (and be sure it won't throw any + // exception) (for the sake of the example, imagine we are sure that the + // queue wasn't empty, otherwise this would be an infinite loop) + explicit operator bool() const noexcept { return f_.operator bool(); } + + private: + TaskFunc f_{}; +}; + +#endif // INCLUDED_SRC_BUILDTOOL_MULTITHREADING_TASK_HPP |