adb: fdevent: move TerminateLoop to fdevent_context.

Test: adb_test
Change-Id: Ib1f20aefdb36603e2ceac4197c02551f557056ee
diff --git a/adb/fdevent/fdevent.cpp b/adb/fdevent/fdevent.cpp
index 698b293..d2f81e0 100644
--- a/adb/fdevent/fdevent.cpp
+++ b/adb/fdevent/fdevent.cpp
@@ -63,6 +63,11 @@
     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 c007e51..e84cff7 100644
--- a/adb/fdevent/fdevent.h
+++ b/adb/fdevent/fdevent.h
@@ -71,8 +71,9 @@
     // trigger repeatedly every |timeout| ms.
     virtual void SetTimeout(fdevent* fde, std::optional<std::chrono::milliseconds> 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 @@
     void Run(std::function<void()> fn);
 
     // Test-only functionality:
-    virtual void TerminateLoop() = 0;
+    void TerminateLoop();
     virtual size_t InstalledCount() = 0;
 
   protected:
@@ -94,6 +95,7 @@
     void FlushRunQueue() EXCLUDES(run_queue_mutex_);
 
     std::optional<uint64_t> main_thread_id_ = std::nullopt;
+    std::atomic<bool> terminate_loop_ = false;
 
   private:
     std::mutex run_queue_mutex_;
diff --git a/adb/fdevent/fdevent_poll.cpp b/adb/fdevent/fdevent_poll.cpp
index 8a12162..43fd462 100644
--- a/adb/fdevent/fdevent_poll.cpp
+++ b/adb/fdevent/fdevent_poll.cpp
@@ -392,11 +392,6 @@
     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 b0465b9..9ae47ba 100644
--- a/adb/fdevent/fdevent_poll.h
+++ b/adb/fdevent/fdevent_poll.h
@@ -58,7 +58,6 @@
 
     virtual void Loop() final;
 
-    virtual void TerminateLoop() final;
     virtual size_t InstalledCount() final;
 
   protected:
@@ -73,5 +72,4 @@
 
     unique_fd interrupt_fd_;
     fdevent* interrupt_fde_ = nullptr;
-    std::atomic<bool> terminate_loop_ = false;
 };