]> git.ozlabs.org Git - ccan/blobdiff - ccan/io/io.h
io: io_close_other()
[ccan] / ccan / io / io.h
index 6248fec02c2e5c5ae3d42e65d80eb8483af1d5aa..558a8769e1428355c254af670790d01f5ccda09e 100644 (file)
@@ -431,6 +431,21 @@ struct io_conn *io_duplex_(struct io_conn *conn, struct io_plan plan);
 #define io_wake(conn, plan) (io_plan_no_debug(), io_wake_((conn), (plan)))
 void io_wake_(struct io_conn *conn, struct io_plan plan);
 
+/**
+ * io_is_idle - is a connection idle?
+ *
+ * This can be useful for complex protocols, eg. where you want a connection
+ * to send something, so you queue it and wake it if it's idle.
+ *
+ * Example:
+ *     struct io_conn *sleeper;
+ *     sleeper = io_new_conn(open("/dev/null", O_RDONLY), io_idle());
+ *
+ *     assert(io_is_idle(sleeper));
+ *     io_wake(sleeper, io_write("junk", 4, io_close_cb, NULL));
+ */
+bool io_is_idle(const struct io_conn *conn);
+
 /**
  * io_break - return from io_loop()
  * @ret: non-NULL value to return from io_loop().
@@ -480,6 +495,24 @@ struct io_plan io_close_(void);
  */
 struct io_plan io_close_cb(struct io_conn *, void *unused);
 
+/**
+ * io_close_other - close different connection next time around the I/O loop.
+ * @conn: the connection to close.
+ *
+ * This is used to force a different connection to close: no more I/O will
+ * happen on @conn, even if it's pending.
+ *
+ * It's a bug to use this on the current connection!
+ *
+ * Example:
+ * static void stop_connection(struct io_conn *conn)
+ * {
+ *     printf("forcing stop on connection\n");
+ *     io_close_other(conn);
+ * }
+ */
+void io_close_other(struct io_conn *conn);
+
 /**
  * io_loop - process fds until all closed on io_break.
  *