]> git.ozlabs.org Git - ccan/blobdiff - ccan/io/backend.h
io: don't do wakeup immediately.
[ccan] / ccan / io / backend.h
index 9f8c546c06a6a28135f8ffe2d2176e009e1e6b34..39605ec48662114944f184f4739848e1d2953c0d 100644 (file)
@@ -22,6 +22,39 @@ struct io_listener {
        void *arg;
 };
 
+enum io_plan_status {
+       /* As before calling next function. */
+       IO_UNSET,
+       /* Normal. */
+       IO_POLLING,
+       /* Waiting for io_wake */
+       IO_WAITING,
+       /* Always do this. */
+       IO_ALWAYS,
+       /* Closing (both plans will be the same). */
+       IO_CLOSING
+};
+
+/**
+ * struct io_plan - one half of I/O to do
+ * @status: the status of this plan.
+ * @io: function to call when fd becomes read/writable, returns 0 to be
+ *      called again, 1 if it's finished, and -1 on error (fd will be closed)
+ * @next: the next function which is called if io returns 1.
+ * @next_arg: the argument to @next
+ * @u1, @u2: scratch space for @io.
+ */
+struct io_plan {
+       enum io_plan_status status;
+
+       int (*io)(int fd, struct io_plan_arg *arg);
+
+       struct io_plan *(*next)(struct io_conn *, void *next_arg);
+       void *next_arg;
+
+       struct io_plan_arg arg;
+};
+
 /* One connection per client. */
 struct io_conn {
        struct fd fd;
@@ -55,6 +88,6 @@ void backend_del_conn(struct io_conn *conn);
 
 void io_ready(struct io_conn *conn, int pollflags);
 void io_do_always(struct io_conn *conn);
-void io_do_wakeup(struct io_conn *conn, struct io_plan *plan);
+void io_do_wakeup(struct io_conn *conn, enum io_direction dir);
 void *do_io_loop(struct io_conn **ready);
 #endif /* CCAN_IO_BACKEND_H */