adb: de-globalize fdevent context.

Test: adb_test
Test: adbd_test
Change-Id: If711257d831b9090b38412821466c1d358d53d2d
diff --git a/adb/fdevent/fdevent.h b/adb/fdevent/fdevent.h
index 42dbb9e..a953cc1 100644
--- a/adb/fdevent/fdevent.h
+++ b/adb/fdevent/fdevent.h
@@ -36,6 +36,43 @@
 typedef void (*fd_func)(int fd, unsigned events, void *userdata);
 typedef void (*fd_func2)(struct fdevent* fde, unsigned events, void* userdata);
 
+struct fdevent;
+
+struct fdevent_context {
+    virtual ~fdevent_context() = default;
+
+    // Allocate and initialize a new fdevent object.
+    virtual fdevent* Create(unique_fd fd, std::variant<fd_func, fd_func2> func, void* arg) = 0;
+
+    // Deallocate an fdevent object, returning the file descriptor that was owned by it.
+    virtual unique_fd Destroy(fdevent* fde) = 0;
+
+    // Change which events should cause notifications.
+    virtual void Set(fdevent* fde, unsigned events) = 0;
+    virtual void Add(fdevent* fde, unsigned events) = 0;
+    virtual void Del(fdevent* fde, unsigned events) = 0;
+
+    // Set a timeout on an fdevent.
+    // If no events are triggered by the timeout, an FDE_TIMEOUT will be generated.
+    // Note timeouts are not defused automatically; if a timeout is set on an fdevent, it will
+    // trigger repeatedly every |timeout| ms.
+    virtual void SetTimeout(fdevent* fde, std::optional<std::chrono::milliseconds> timeout) = 0;
+
+    // Loop forever, handling events.
+    virtual void Loop() = 0;
+
+    // Assert that the caller is running on the context's main thread.
+    virtual void CheckMainThread() = 0;
+
+    // Queue an operation to be run on the main thread.
+    virtual void Run(std::function<void()> fn) = 0;
+
+    // Test-only functionality:
+    virtual void TerminateLoop() = 0;
+    virtual size_t InstalledCount() = 0;
+    virtual void Reset() = 0;
+};
+
 struct fdevent {
     uint64_t id;
 
@@ -51,31 +88,18 @@
     void* arg = nullptr;
 };
 
-// Allocate and initialize a new fdevent object
-// TODO: Switch these to unique_fd.
-fdevent *fdevent_create(int fd, fd_func func, void *arg);
+// Backwards compatibility shims that forward to the global fdevent_context.
+fdevent* fdevent_create(int fd, fd_func func, void* arg);
 fdevent* fdevent_create(int fd, fd_func2 func, void* arg);
 
-// Deallocate an fdevent object that was created by fdevent_create.
-void fdevent_destroy(fdevent *fde);
-
-// fdevent_destroy, except releasing the file descriptor previously owned by the fdevent.
 unique_fd fdevent_release(fdevent* fde);
+void fdevent_destroy(fdevent* fde);
 
-// Change which events should cause notifications
 void fdevent_set(fdevent *fde, unsigned events);
 void fdevent_add(fdevent *fde, unsigned events);
 void fdevent_del(fdevent *fde, unsigned events);
-
-// Set a timeout on an fdevent.
-// If no events are triggered by the timeout, an FDE_TIMEOUT will be generated.
-// Note timeouts are not defused automatically; if a timeout is set on an fdevent, it will
-// trigger repeatedly every |timeout| ms.
 void fdevent_set_timeout(fdevent* fde, std::optional<std::chrono::milliseconds> timeout);
-
-// Loop forever, handling events.
 void fdevent_loop();
-
 void check_main_thread();
 
 // Queue an operation to run on the main thread.
@@ -85,6 +109,5 @@
 void fdevent_terminate_loop();
 size_t fdevent_installed_count();
 void fdevent_reset();
-void set_main_thread();
 
 #endif