]>
git.proxmox.com Git - ceph.git/blob - ceph/src/test/crimson/seastar_runner.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
10 #include <seastar/core/app-template.hh>
11 #include <seastar/core/future-util.hh>
12 #include <seastar/core/reactor.hh>
13 #include <seastar/core/alien.hh>
14 #include <seastar/core/thread.hh>
16 struct SeastarRunner
{
17 static constexpr eventfd_t APP_RUNNING
= 1;
18 static constexpr eventfd_t APP_NOT_RUN
= 2;
20 seastar::app_template app
;
21 seastar::file_desc begin_fd
;
22 std::unique_ptr
<seastar::readable_eventfd
> on_end
;
26 bool begin_signaled
= false;
29 begin_fd
{seastar::file_desc::eventfd(0, 0)} {}
33 bool is_running() const {
37 int init(int argc
, char **argv
)
39 thread
= std::thread([argc
, argv
, this] { reactor(argc
, argv
); });
41 if (int r
= ::eventfd_read(begin_fd
.get(), &result
); r
< 0) {
42 std::cerr
<< "unable to eventfd_read():" << errno
<< std::endl
;
45 assert(begin_signaled
== true);
46 if (result
== APP_RUNNING
) {
50 assert(result
== APP_NOT_RUN
);
51 assert(!is_running());
60 on_end
->write_side().signal(1);
61 return seastar::now();
67 void reactor(int argc
, char **argv
)
69 auto ret
= app
.run(argc
, argv
, [this] {
70 on_end
.reset(new seastar::readable_eventfd
);
71 return seastar::now().then([this] {
72 begin_signaled
= true;
73 auto r
= ::eventfd_write(begin_fd
.get(), APP_RUNNING
);
75 return seastar::now();
77 return on_end
->wait().then([](size_t){});
78 }).handle_exception([](auto ep
) {
79 std::cerr
<< "Error: " << ep
<< std::endl
;
85 std::cerr
<< "Seastar app returns " << ret
<< std::endl
;
87 if (!begin_signaled
) {
88 begin_signaled
= true;
89 ::eventfd_write(begin_fd
.get(), APP_NOT_RUN
);
93 template <typename Func
>
94 void run(Func
&&func
) {
96 auto fut
= seastar::alien::submit_to(app
.alien(), 0,
97 std::forward
<Func
>(func
));