{
::testing::InitGoogleTest(&argc, argv);
- seastar_test_suite_t::seastar_env.init(argc, argv);
+ int ret = seastar_test_suite_t::seastar_env.init(argc, argv);
+ if (ret != 0) {
+ seastar_test_suite_t::seastar_env.stop();
+ return ret;
+ }
// HACK: differntiate between the `make check` bot and human user
// for the sake of log flooding
});
});
- int ret = RUN_ALL_TESTS();
+ ret = RUN_ALL_TESTS();
seastar_test_suite_t::seastar_env.run([] {
return crimson::common::sharded_perf_coll().stop().then([] {
#include <seastar/core/thread.hh>
struct SeastarRunner {
+ static constexpr eventfd_t APP_RUNNING = 1;
+ static constexpr eventfd_t APP_NOT_RUN = 2;
+
seastar::app_template app;
seastar::file_desc begin_fd;
std::unique_ptr<seastar::readable_eventfd> on_end;
std::thread thread;
+ bool begin_signaled = false;
+
SeastarRunner() :
begin_fd{seastar::file_desc::eventfd(0, 0)} {}
~SeastarRunner() {}
- void init(int argc, char **argv)
+ bool is_running() const {
+ return !!on_end;
+ }
+
+ int init(int argc, char **argv)
{
thread = std::thread([argc, argv, this] { reactor(argc, argv); });
- eventfd_t result = 0;
+ eventfd_t result;
if (int r = ::eventfd_read(begin_fd.get(), &result); r < 0) {
std::cerr << "unable to eventfd_read():" << errno << std::endl;
- throw std::runtime_error("Cannot start seastar");
+ return r;
+ }
+ assert(begin_signaled == true);
+ if (result == APP_RUNNING) {
+ assert(is_running());
+ return 0;
+ } else {
+ assert(result == APP_NOT_RUN);
+ assert(!is_running());
+ return 1;
}
}
void stop()
{
- run([this] {
- on_end->write_side().signal(1);
- return seastar::now();
- });
+ if (is_running()) {
+ run([this] {
+ on_end->write_side().signal(1);
+ return seastar::now();
+ });
+ }
thread.join();
}
void reactor(int argc, char **argv)
{
- app.run(argc, argv, [this] {
+ auto ret = app.run(argc, argv, [this] {
on_end.reset(new seastar::readable_eventfd);
return seastar::now().then([this] {
- ::eventfd_write(begin_fd.get(), 1);
- return seastar::now();
+ auto r = ::eventfd_write(begin_fd.get(), APP_RUNNING);
+ assert(r == 0);
+ begin_signaled = true;
+ return seastar::now();
}).then([this] {
return on_end->wait().then([](size_t){});
}).handle_exception([](auto ep) {
on_end.reset();
});
});
+ if (ret != 0) {
+ std::cerr << "Seastar app returns " << ret << std::endl;
+ }
+ if (!begin_signaled) {
+ ::eventfd_write(begin_fd.get(), APP_NOT_RUN);
+ begin_signaled = true;
+ }
}
template <typename Func>
void run(Func &&func) {
+ assert(is_running());
auto fut = seastar::alien::submit_to(app.alien(), 0,
std::forward<Func>(func));
fut.get();