]> git.ozlabs.org Git - ccan/blobdiff - ccan/io/io.h
io: allow overriding poll function.
[ccan] / ccan / io / io.h
index 1664df65f26e353120762f1ab89abc65ee01f1c9..11eeade63f820c2be20a296c6c7583f771b002a3 100644 (file)
@@ -4,6 +4,7 @@
 #include <ccan/tal/tal.h>
 #include <ccan/typesafe_cb/typesafe_cb.h>
 #include <stdbool.h>
+#include <poll.h>
 #include <unistd.h>
 
 struct timers;
@@ -673,6 +674,24 @@ void *io_loop(struct timers *timers, struct timer **expired);
  */
 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.
@@ -683,4 +702,14 @@ int io_conn_fd(const struct io_conn *conn);
  */
 struct timemono (*io_time_override(struct timemono (*now)(void)))(void);
 
+/**
+ * io_poll_override - override the normal call for poll.
+ * @pollfn: the function to call.
+ *
+ * io usually uses poll() internally, but this forces it to use your
+ * function (eg. for debugging, suppressing fds, or polling on others unknown
+ * to ccan/io).  Returns the old one.
+ */
+int (*io_poll_override(int (*poll)(struct pollfd *fds, nfds_t nfds, int timeout)))(struct pollfd *, nfds_t, int);
+
 #endif /* CCAN_IO_H */