diff --git a/adb/fdevent/fdevent.cpp b/adb/fdevent/fdevent.cpp index 698b29353..d2f81e004 100644 --- a/adb/fdevent/fdevent.cpp +++ b/adb/fdevent/fdevent.cpp @@ -63,6 +63,11 @@ void fdevent_context::Run(std::function fn) { Interrupt(); } +void fdevent_context::TerminateLoop() { + terminate_loop_ = true; + Interrupt(); +} + void fdevent_context::FlushRunQueue() { // We need to be careful around reentrancy here, since a function we call can queue up another // function. diff --git a/adb/fdevent/fdevent.h b/adb/fdevent/fdevent.h index c007e518b..e84cff799 100644 --- a/adb/fdevent/fdevent.h +++ b/adb/fdevent/fdevent.h @@ -71,8 +71,9 @@ struct fdevent_context { // trigger repeatedly every |timeout| ms. virtual void SetTimeout(fdevent* fde, std::optional timeout) = 0; - // Loop forever, handling events. - // Implementations should call FlushRunQueue on every iteration. + // Loop until TerminateLoop is called, handling events. + // Implementations should call FlushRunQueue on every iteration, and check the value of + // terminate_loop_ to determine whether to stop. virtual void Loop() = 0; // Assert that the caller is either running on the context's main thread, or that there is no @@ -83,7 +84,7 @@ struct fdevent_context { void Run(std::function fn); // Test-only functionality: - virtual void TerminateLoop() = 0; + void TerminateLoop(); virtual size_t InstalledCount() = 0; protected: @@ -94,6 +95,7 @@ struct fdevent_context { void FlushRunQueue() EXCLUDES(run_queue_mutex_); std::optional main_thread_id_ = std::nullopt; + std::atomic terminate_loop_ = false; private: std::mutex run_queue_mutex_; diff --git a/adb/fdevent/fdevent_poll.cpp b/adb/fdevent/fdevent_poll.cpp index 8a1216283..43fd462a0 100644 --- a/adb/fdevent/fdevent_poll.cpp +++ b/adb/fdevent/fdevent_poll.cpp @@ -392,11 +392,6 @@ void fdevent_context_poll::Loop() { main_thread_id_.reset(); } -void fdevent_context_poll::TerminateLoop() { - terminate_loop_ = true; - Interrupt(); -} - size_t fdevent_context_poll::InstalledCount() { // We always have an installed fde for interrupt. return poll_node_map_.size() - 1; diff --git a/adb/fdevent/fdevent_poll.h b/adb/fdevent/fdevent_poll.h index b0465b959..9ae47baaf 100644 --- a/adb/fdevent/fdevent_poll.h +++ b/adb/fdevent/fdevent_poll.h @@ -58,7 +58,6 @@ struct fdevent_context_poll : public fdevent_context { virtual void Loop() final; - virtual void TerminateLoop() final; virtual size_t InstalledCount() final; protected: @@ -73,5 +72,4 @@ struct fdevent_context_poll : public fdevent_context { unique_fd interrupt_fd_; fdevent* interrupt_fde_ = nullptr; - std::atomic terminate_loop_ = false; };