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: Rusty Russell <rusty@rustcorp.com.au>
int fd;
bool listener;
size_t backend_info;
int fd;
bool listener;
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. */
struct io_listener {
struct fd fd;
};
/* Listeners create connections. */
struct io_listener {
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;
struct io_conn {
struct fd fd;
struct io_conn {
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_timeout *timeout;
struct io_conn *duplex;
struct io_timeout *timeout;
l->fd.listener = true;
l->fd.fd = fd;
l->fd.listener = true;
l->fd.fd = fd;
- l->fd.next = start;
- l->fd.finish = finish;
- l->fd.finish_arg = l->fd.next_arg = arg;
+ l->next = start;
+ l->finish = finish;
+ l->conn_arg = arg;
if (!add_listener(l)) {
free(l);
return NULL;
if (!add_listener(l)) {
free(l);
return NULL;
conn->fd.listener = false;
conn->fd.fd = fd;
conn->fd.listener = false;
conn->fd.fd = fd;
- conn->fd.next = start;
- conn->fd.finish = finish;
- conn->fd.finish_arg = conn->fd.next_arg = arg;
+ conn->next = start;
+ conn->finish = finish;
+ conn->finish_arg = conn->next_arg = arg;
conn->pollflag = 0;
conn->state = NEXT;
conn->duplex = NULL;
conn->pollflag = 0;
conn->state = NEXT;
conn->duplex = NULL;
conn->fd.listener = false;
conn->fd.fd = old->fd.fd;
conn->fd.listener = false;
conn->fd.fd = old->fd.fd;
- conn->fd.next = start;
- conn->fd.finish = finish;
- conn->fd.finish_arg = conn->fd.next_arg = arg;
+ conn->next = start;
+ conn->finish = finish;
+ conn->finish_arg = conn->next_arg = arg;
conn->pollflag = 0;
conn->state = NEXT;
conn->duplex = old;
conn->pollflag = 0;
conn->state = NEXT;
conn->duplex = old;
{
conn->u.write.buf = data;
conn->u.write.len = len;
{
conn->u.write.buf = data;
conn->u.write.len = len;
- conn->fd.next = cb;
- conn->fd.next_arg = arg;
+ conn->next = cb;
+ conn->next_arg = arg;
conn->pollflag = POLLOUT;
return to_ioplan(WRITE);
}
conn->pollflag = POLLOUT;
return to_ioplan(WRITE);
}
{
conn->u.read.buf = data;
conn->u.read.len = len;
{
conn->u.read.buf = data;
conn->u.read.len = len;
- conn->fd.next = cb;
- conn->fd.next_arg = arg;
+ conn->next = cb;
+ conn->next_arg = arg;
conn->pollflag = POLLIN;
return to_ioplan(READ);
}
conn->pollflag = POLLIN;
return to_ioplan(READ);
}
{
conn->u.readpart.buf = data;
conn->u.readpart.lenp = len;
{
conn->u.readpart.buf = data;
conn->u.readpart.lenp = len;
- conn->fd.next = cb;
- conn->fd.next_arg = arg;
+ conn->next = cb;
+ conn->next_arg = arg;
conn->pollflag = POLLIN;
return to_ioplan(READPART);
}
conn->pollflag = POLLIN;
return to_ioplan(READPART);
}
{
conn->u.writepart.buf = data;
conn->u.writepart.lenp = len;
{
conn->u.writepart.buf = data;
conn->u.writepart.lenp = len;
- conn->fd.next = cb;
- conn->fd.next_arg = arg;
+ conn->next = cb;
+ conn->next_arg = arg;
conn->pollflag = POLLOUT;
return to_ioplan(WRITEPART);
}
conn->pollflag = POLLOUT;
return to_ioplan(WRITEPART);
}
if (conn->state == FINISHED)
return;
assert(conn->state == IDLE);
if (conn->state == FINISHED)
return;
assert(conn->state == IDLE);
- conn->fd.next = fn;
- conn->fd.next_arg = arg;
+ conn->next = fn;
+ conn->next_arg = arg;
backend_set_state(conn, to_ioplan(NEXT));
}
backend_set_state(conn, to_ioplan(NEXT));
}
{
if (timeout_active(conn))
backend_del_timeout(conn);
{
if (timeout_active(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)
void *arg)
{
io_loop_return = ret;
void *arg)
{
io_loop_return = ret;
- conn->fd.next = fn;
- conn->fd.next_arg = arg;
+ conn->next = fn;
+ conn->next_arg = arg;
return to_ioplan(NEXT);
}
return to_ioplan(NEXT);
}
static void del_conn(struct io_conn *conn)
{
static void del_conn(struct io_conn *conn)
{
- if (conn->fd.finish)
- conn->fd.finish(conn, conn->fd.finish_arg);
+ if (conn->finish)
+ conn->finish(conn, conn->finish_arg);
if (timeout_active(conn))
backend_del_timeout(conn);
free(conn->timeout);
if (timeout_active(conn))
backend_del_timeout(conn);
free(conn->timeout);
/* FIXME: What to do here? */
if (fd < 0)
return;
/* FIXME: What to do here? */
if (fd < 0)
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) {
close(fd);
return;
if (!c) {
close(fd);
return;
free(c);
i--;
} else if (!finished_only && c->state == NEXT) {
free(c);
i--;
} else if (!finished_only && c->state == NEXT) {
- backend_set_state(c,
- c->fd.next(c,
- c->fd.next_arg));
+ backend_set_state(c, c->next(c, c->next_arg));