]> git.ozlabs.org Git - ccan/blobdiff - ccan/io/io.h
io: add io_flush_sync().
[ccan] / ccan / io / io.h
index 54300ce4575ba684389c93c478afa16d8b4d1e6b..fe42b53736005c4459c3b56afbbaa87ffe46f04a 100644 (file)
@@ -630,12 +630,14 @@ struct io_plan *io_close_cb(struct io_conn *, void *unused);
 
 /**
  * io_close_taken_fd - close a connection, but remove the filedescriptor first.
- * @conn: the connection to take the file descriptor from and close,
+ * @conn: the connection to take the file descriptor from and close.
  *
  * io_close closes the file descriptor underlying the io_conn; this version does
  * not.  Presumably you have used io_conn_fd() on it beforehand and will take
  * care of the fd yourself.
  *
+ * Note that this also turns off O_NONBLOCK on the fd.
+ *
  * Example:
  * static struct io_plan *steal_fd(struct io_conn *conn, int *fd)
  * {
@@ -664,10 +666,31 @@ void *io_loop(struct timers *timers, struct timer **expired);
  * io_conn_fd - get the fd from a connection.
  * @conn: the connection.
  *
- * Sometimes useful, eg for getsockname().
+ * Sometimes useful, eg for getsockname().  Note that the fd is O_NONBLOCK.
+ *
+ * See Also:
+ *     io_close_taken_fd
  */
 int io_conn_fd(const struct io_conn *conn);
 
+/**
+ * io_flush_sync - (synchronously) complete any outstanding output.
+ * @conn: the connection.
+ *
+ * This is generally used as an emergency escape, for example when we
+ * want to write an error message on a socket before terminating, but it may
+ * be in the middle of existing I/O.  We don't want to service any other
+ * IO, either.
+ *
+ * This returns true if all pending output is complete, false on error.
+ * The next callback is not called on the conn, but will be as soon as
+ * io_loop() is called.
+ *
+ * See Also:
+ *     io_close_taken_fd
+ */
+bool io_flush_sync(struct io_conn *conn);
+
 /**
  * io_time_override - override the normal call for time.
  * @nowfn: the function to call.