26 #if !LELY_NO_COAPP_MASTER && !LELY_NO_THREADS
56 ::std::atomic_flag shutdown;
63 ::std::atomic_flag joined;
76 :
BasicDriver(strand.get_inner_executor(), master, id),
77 impl_(new
Impl_(this, master.GetContext())) {}
88 return impl_->stopped.get_future();
96 }
catch (const ::std::system_error& e) {
105 ::std::error_code ec;
107 if (ec) throw ::std::system_error(ec,
"USleep");
112 GetLoop().run_for(::std::chrono::microseconds(usec), ec);
113 if (ec == ::std::errc::timed_out) {
115 }
else if (!ec && GetLoop().stopped()) {
126 thread(&Impl_::Start, this)
132 [](
void* arg) noexcept {
137 util::throw_errc(
"thrd_create");
142 LoopDriver::Impl_::~Impl_() {
148 LoopDriver::Impl_::Start() {
149 auto& loop =
self->GetLoop();
150 auto exec =
self->GetExecutor();
160 self->master.Erase(*
self);
172 LoopDriver::Impl_::Shutdown() {
173 if (!shutdown.test_and_set()) {
175 self->master.Erase(*
self);
177 self->GetLoop().stop();
182 LoopDriver::Impl_::Join() {
183 if (!joined.test_and_set()) {
197 #endif // !LELY_NO_COAPP_MASTER && !LELY_NO_THREADS