Commit 174fe59f authored by Rusty Russell's avatar Rusty Russell

ccan/io: remove next & finish from union.

Sure, both listener and conn need them, but for different things
(listener uses them simply to set up conn).  Putting them in the
common union was a mistake.
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 7f4e5627
...@@ -8,18 +8,17 @@ struct fd { ...@@ -8,18 +8,17 @@ struct fd {
int fd; int fd;
bool listener; bool listener;
size_t backend_info; size_t backend_info;
struct io_plan *(*next)(struct io_conn *, void *arg);
void *next_arg;
void (*finish)(struct io_conn *, void *arg);
void *finish_arg;
}; };
/* Listeners create connections. */ /* Listeners create connections. */
struct io_listener { struct io_listener {
struct fd fd; struct fd fd;
/* These are for connections we create. */
struct io_plan *(*next)(struct io_conn *, void *arg);
void (*finish)(struct io_conn *, void *arg);
void *conn_arg;
}; };
enum io_state { enum io_state {
...@@ -74,6 +73,12 @@ struct io_timeout { ...@@ -74,6 +73,12 @@ struct io_timeout {
struct io_conn { struct io_conn {
struct fd fd; struct fd fd;
struct io_plan *(*next)(struct io_conn *, void *arg);
void *next_arg;
void (*finish)(struct io_conn *, void *arg);
void *finish_arg;
struct io_conn *duplex; struct io_conn *duplex;
struct io_timeout *timeout; struct io_timeout *timeout;
......
...@@ -25,9 +25,9 @@ struct io_listener *io_new_listener_(int fd, ...@@ -25,9 +25,9 @@ struct io_listener *io_new_listener_(int fd,
l->fd.listener = true; l->fd.listener = true;
l->fd.fd = fd; l->fd.fd = fd;
l->fd.next = start; l->next = start;
l->fd.finish = finish; l->finish = finish;
l->fd.finish_arg = l->fd.next_arg = arg; l->conn_arg = arg;
if (!add_listener(l)) { if (!add_listener(l)) {
free(l); free(l);
return NULL; return NULL;
...@@ -54,9 +54,9 @@ struct io_conn *io_new_conn_(int fd, ...@@ -54,9 +54,9 @@ struct io_conn *io_new_conn_(int fd,
conn->fd.listener = false; conn->fd.listener = false;
conn->fd.fd = fd; conn->fd.fd = fd;
conn->fd.next = start; conn->next = start;
conn->fd.finish = finish; conn->finish = finish;
conn->fd.finish_arg = conn->fd.next_arg = arg; conn->finish_arg = conn->next_arg = arg;
conn->pollflag = 0; conn->pollflag = 0;
conn->state = NEXT; conn->state = NEXT;
conn->duplex = NULL; conn->duplex = NULL;
...@@ -83,9 +83,9 @@ struct io_conn *io_duplex_(struct io_conn *old, ...@@ -83,9 +83,9 @@ struct io_conn *io_duplex_(struct io_conn *old,
conn->fd.listener = false; conn->fd.listener = false;
conn->fd.fd = old->fd.fd; conn->fd.fd = old->fd.fd;
conn->fd.next = start; conn->next = start;
conn->fd.finish = finish; conn->finish = finish;
conn->fd.finish_arg = conn->fd.next_arg = arg; conn->finish_arg = conn->next_arg = arg;
conn->pollflag = 0; conn->pollflag = 0;
conn->state = NEXT; conn->state = NEXT;
conn->duplex = old; conn->duplex = old;
...@@ -126,8 +126,8 @@ struct io_plan *io_write_(struct io_conn *conn, const void *data, size_t len, ...@@ -126,8 +126,8 @@ struct io_plan *io_write_(struct io_conn *conn, const void *data, size_t len,
{ {
conn->u.write.buf = data; conn->u.write.buf = data;
conn->u.write.len = len; conn->u.write.len = len;
conn->fd.next = cb; conn->next = cb;
conn->fd.next_arg = arg; conn->next_arg = arg;
conn->pollflag = POLLOUT; conn->pollflag = POLLOUT;
return to_ioplan(WRITE); return to_ioplan(WRITE);
} }
...@@ -139,8 +139,8 @@ struct io_plan *io_read_(struct io_conn *conn, void *data, size_t len, ...@@ -139,8 +139,8 @@ struct io_plan *io_read_(struct io_conn *conn, void *data, size_t len,
{ {
conn->u.read.buf = data; conn->u.read.buf = data;
conn->u.read.len = len; conn->u.read.len = len;
conn->fd.next = cb; conn->next = cb;
conn->fd.next_arg = arg; conn->next_arg = arg;
conn->pollflag = POLLIN; conn->pollflag = POLLIN;
return to_ioplan(READ); return to_ioplan(READ);
} }
...@@ -152,8 +152,8 @@ struct io_plan *io_read_partial_(struct io_conn *conn, void *data, size_t *len, ...@@ -152,8 +152,8 @@ struct io_plan *io_read_partial_(struct io_conn *conn, void *data, size_t *len,
{ {
conn->u.readpart.buf = data; conn->u.readpart.buf = data;
conn->u.readpart.lenp = len; conn->u.readpart.lenp = len;
conn->fd.next = cb; conn->next = cb;
conn->fd.next_arg = arg; conn->next_arg = arg;
conn->pollflag = POLLIN; conn->pollflag = POLLIN;
return to_ioplan(READPART); return to_ioplan(READPART);
} }
...@@ -166,8 +166,8 @@ struct io_plan *io_write_partial_(struct io_conn *conn, ...@@ -166,8 +166,8 @@ struct io_plan *io_write_partial_(struct io_conn *conn,
{ {
conn->u.writepart.buf = data; conn->u.writepart.buf = data;
conn->u.writepart.lenp = len; conn->u.writepart.lenp = len;
conn->fd.next = cb; conn->next = cb;
conn->fd.next_arg = arg; conn->next_arg = arg;
conn->pollflag = POLLOUT; conn->pollflag = POLLOUT;
return to_ioplan(WRITEPART); return to_ioplan(WRITEPART);
} }
...@@ -186,8 +186,8 @@ void io_wake_(struct io_conn *conn, ...@@ -186,8 +186,8 @@ void io_wake_(struct io_conn *conn,
if (conn->state == FINISHED) if (conn->state == FINISHED)
return; return;
assert(conn->state == IDLE); assert(conn->state == IDLE);
conn->fd.next = fn; conn->next = fn;
conn->fd.next_arg = arg; conn->next_arg = arg;
backend_set_state(conn, to_ioplan(NEXT)); backend_set_state(conn, to_ioplan(NEXT));
} }
...@@ -195,7 +195,7 @@ static struct io_plan *do_next(struct io_conn *conn) ...@@ -195,7 +195,7 @@ static struct io_plan *do_next(struct io_conn *conn)
{ {
if (timeout_active(conn)) if (timeout_active(conn))
backend_del_timeout(conn); backend_del_timeout(conn);
return conn->fd.next(conn, conn->fd.next_arg); return conn->next(conn, conn->next_arg);
} }
struct io_plan *do_ready(struct io_conn *conn) struct io_plan *do_ready(struct io_conn *conn)
...@@ -259,8 +259,8 @@ struct io_plan *io_break_(struct io_conn *conn, void *ret, ...@@ -259,8 +259,8 @@ struct io_plan *io_break_(struct io_conn *conn, void *ret,
void *arg) void *arg)
{ {
io_loop_return = ret; io_loop_return = ret;
conn->fd.next = fn; conn->next = fn;
conn->fd.next_arg = arg; conn->next_arg = arg;
return to_ioplan(NEXT); return to_ioplan(NEXT);
} }
...@@ -90,8 +90,8 @@ bool add_duplex(struct io_conn *c) ...@@ -90,8 +90,8 @@ bool add_duplex(struct io_conn *c)
static void del_conn(struct io_conn *conn) static void del_conn(struct io_conn *conn)
{ {
if (conn->fd.finish) if (conn->finish)
conn->fd.finish(conn, conn->fd.finish_arg); conn->finish(conn, conn->finish_arg);
if (timeout_active(conn)) if (timeout_active(conn))
backend_del_timeout(conn); backend_del_timeout(conn);
free(conn->timeout); free(conn->timeout);
...@@ -146,7 +146,7 @@ static void accept_conn(struct io_listener *l) ...@@ -146,7 +146,7 @@ static void accept_conn(struct io_listener *l)
/* FIXME: What to do here? */ /* FIXME: What to do here? */
if (fd < 0) if (fd < 0)
return; return;
c = io_new_conn(fd, l->fd.next, l->fd.finish, l->fd.next_arg); c = io_new_conn(fd, l->next, l->finish, l->conn_arg);
if (!c) { if (!c) {
close(fd); close(fd);
return; return;
...@@ -174,9 +174,7 @@ static void finish_and_next(bool finished_only) ...@@ -174,9 +174,7 @@ static void finish_and_next(bool finished_only)
free(c); free(c);
i--; i--;
} else if (!finished_only && c->state == NEXT) { } else if (!finished_only && c->state == NEXT) {
backend_set_state(c, backend_set_state(c, c->next(c, c->next_arg));
c->fd.next(c,
c->fd.next_arg));
num_next--; num_next--;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment