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