X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fio%2Fio.h;h=5820f87750059ebf3fd9a1bfaaac14a0bbc51df8;hb=0f16a4197c94bfa84dad56d0cb9a9c20438d0a45;hp=72f805244c91ad89c4404703f4b276608339142f;hpb=e2ce04eac30ec613c858bd4cd2ca12e1c464edb8;p=ccan diff --git a/ccan/io/io.h b/ccan/io/io.h index 72f80524..5820f877 100644 --- a/ccan/io/io.h +++ b/ccan/io/io.h @@ -67,25 +67,34 @@ static inline void io_plan_debug(struct io_plan *plan) { } * io_new_conn - create a new connection. * @fd: the file descriptor. * @plan: the first I/O function. - * @finish: the function to call when it's closed or fails. - * @arg: the argument to @finish. * * This creates a connection which owns @fd. @plan will be called on the - * next io_loop(), and @finish will be called when an I/O operation - * fails, or you call io_close() on the connection. + * next io_loop(). * * Returns NULL on error (and sets errno). */ -#define io_new_conn(fd, plan, finish, arg) \ - (io_plan_other(), io_new_conn_((fd), (plan), \ - typesafe_cb_preargs(void, void *, \ - (finish), (arg), \ - struct io_conn *), \ - (arg))) -struct io_conn *io_new_conn_(int fd, - struct io_plan plan, - void (*finish)(struct io_conn *, void *), - void *arg); +#define io_new_conn(fd, plan) \ + (io_plan_other(), io_new_conn_((fd), (plan))) +struct io_conn *io_new_conn_(int fd, struct io_plan plan); + +/** + * io_set_finish - set finish function on a connection. + * @conn: the connection. + * @finish: the function to call when it's closed or fails. + * @arg: the argument to @finish. + * + * @finish will be called when an I/O operation fails, or you call + * io_close() on the connection. + */ +#define io_set_finish(conn, finish, arg) \ + io_set_finish_((conn), \ + typesafe_cb_preargs(void, void *, \ + (finish), (arg), \ + struct io_conn *), \ + (arg)) +void io_set_finish_(struct io_conn *conn, + void (*finish)(struct io_conn *, void *), + void *arg); /** * io_new_listener - create a new accepting listener. @@ -241,8 +250,6 @@ bool io_timeout_(struct io_conn *conn, struct timespec ts, * io_duplex - split an fd into two connections. * @conn: a connection. * @plan: the first I/O function to call. - * @finish: the function to call when it's closed or fails. - * @arg: the argument to @finish. * * Sometimes you want to be able to simultaneously read and write on a * single fd, but io forces a linear call sequence. The solition is @@ -251,17 +258,10 @@ bool io_timeout_(struct io_conn *conn, struct timespec ts, * * You must io_close() both of them to close the fd. */ -#define io_duplex(conn, plan, finish, arg) \ - (io_plan_other(), io_duplex_((conn), (plan), \ - typesafe_cb_preargs(void, void *, \ - (finish), (arg), \ - struct io_conn *), \ - (arg))) +#define io_duplex(conn, plan) \ + (io_plan_other(), io_duplex_((conn), (plan))) -struct io_conn *io_duplex_(struct io_conn *conn, - struct io_plan plan, - void (*finish)(struct io_conn *, void *), - void *arg); +struct io_conn *io_duplex_(struct io_conn *conn, struct io_plan plan); /** * io_wake - wake up an idle connection.