25 #ifndef SEASTAR_MODULE
26 #include <seastar/core/thread_impl.hh>
27 #include <seastar/core/future.hh>
28 #include <seastar/core/do_with.hh>
33 #include <type_traits>
35 #include <seastar/util/std-compat.hh>
36 #include <seastar/util/modules.hh>
38 #include <boost/intrusive/list.hpp>
76 SEASTAR_MODULE_EXPORT_BEGIN
78 class thread_attributes;
83 std::optional<seastar::scheduling_group> sched_group;
85 size_t stack_size = 0;
87 SEASTAR_MODULE_EXPORT_END
90 extern thread_local jmp_buf_link g_unthreaded_context;
95 class thread_context final :
private task {
96 struct stack_deleter {
97 void operator()(
char *ptr)
const noexcept;
99 stack_deleter(
int valgrind_id);
101 using stack_holder = std::unique_ptr<char[], stack_deleter>;
104 noncopyable_function<void ()> _func;
105 jmp_buf_link _context;
107 bool _joined =
false;
109 boost::intrusive::list_member_hook<> _all_link;
110 using all_thread_list = boost::intrusive::list<thread_context,
111 boost::intrusive::member_hook<thread_context, boost::intrusive::list_member_hook<>,
112 &thread_context::_all_link>,
113 boost::intrusive::constant_time_size<false>>;
115 static thread_local all_thread_list _all_threads;
117 static void s_main(
int lo,
int hi);
118 void setup(
size_t stack_size);
120 stack_holder make_stack(
size_t stack_size);
121 virtual void run_and_dispose() noexcept override;
123 thread_context(thread_attributes attr, noncopyable_function<
void ()> func);
127 bool should_yield() const;
130 task* waiting_task() noexcept
override {
return _done.waiting_task(); }
132 friend void thread_impl::switch_in(thread_context*);
133 friend void thread_impl::switch_out(thread_context*);
134 friend scheduling_group thread_impl::sched_group(
const thread_context*);
139 SEASTAR_MODULE_EXPORT
147 std::unique_ptr<thread_context> _context;
148 static thread_local
thread* _current;
157 template <
typename Func>
164 template <
typename Func>
173 ~thread() { assert(!_context || _context->_joined); }
196 static bool running_in_thread() {
197 return thread_impl::get() !=
nullptr;
201 template <
typename Func>
204 : _context(std::make_unique<thread_context>(std::move(attr), std::move(func))) {
207 template <
typename Func>
216 _context->_joined =
true;
217 return _context->_done.get_future();
220 SEASTAR_MODULE_EXPORT_BEGIN
244 template <
typename Func,
typename... Args>
246 futurize_t<std::invoke_result_t<Func, Args...>>
248 using return_type = std::invoke_result_t<Func, Args...>;
252 std::tuple<Args...> args;
258 auto wp = std::make_unique<work>(work{std::move(attr), std::forward<Func>(func), std::forward_as_tuple(std::forward<Args>(args)...)});
260 auto ret = w.pr.get_future();
261 w.th =
thread(std::move(w.attr), [&w] {
262 futurize<return_type>::apply(std::move(w.func), std::move(w.args)).forward_to(std::move(w.pr));
264 return w.th.join().then([ret = std::move(ret)] ()
mutable {
265 return std::move(ret);
266 }).
finally([wp = std::move(wp)] {});
281 template <
typename Func,
typename... Args>
283 futurize_t<std::invoke_result_t<Func, Args...>>
284 async(Func&& func, Args&&... args) noexcept {
289 SEASTAR_MODULE_EXPORT_END
thread - stateful thread of execution
Definition: thread.hh:146
~thread()
Destroys a thread object.
Definition: thread.hh:173
thread(thread &&x) noexcept=default
Moves a thread object.
thread & operator=(thread &&x) noexcept=default
Move-assigns a thread object.
static void maybe_yield()
Yield if this thread ought to call yield() now.
static void yield()
Voluntarily defer execution of current thread.
thread()=default
Constructs a thread object that does not represent a thread of execution.
static bool should_yield()
Checks whether this thread ought to call yield() now.
future yield() noexcept
Returns a future which is not ready but is scheduled to resolve soon.
Class that holds attributes controling the behavior of a thread.
Definition: thread.hh:81
future join()
Waits for thread execution to terminate.
Definition: thread.hh:215
futurize_t< std::invoke_result_t< Func, Args... > > async(thread_attributes attr, Func &&func, Args &&... args) noexcept
Definition: thread.hh:247
Seastar API namespace.
Definition: abort_on_ebadf.hh:26
Converts a type to a future type, if it isn't already.
Definition: future.hh:1843