return plan;
}
+bool io_is_idle(const struct io_conn *conn)
+{
+ return conn->plan.io == NULL;
+}
+
void io_wake_(struct io_conn *conn, struct io_plan plan)
{
#define io_wake(conn, plan) (io_plan_no_debug(), io_wake_((conn), (plan)))
void io_wake_(struct io_conn *conn, struct io_plan plan);
+/**
+ * io_is_idle - is a connection idle?
+ *
+ * This can be useful for complex protocols, eg. where you want a connection
+ * to send something, so you queue it and wake it if it's idle.
+ *
+ * Example:
+ * struct io_conn *sleeper;
+ * sleeper = io_new_conn(open("/dev/null", O_RDONLY), io_idle());
+ *
+ * assert(io_is_idle(sleeper));
+ * io_wake(sleeper, io_write("junk", 4, io_close_cb, NULL));
+ */
+bool io_is_idle(const struct io_conn *conn);
+
/**
* io_break - return from io_loop()
* @ret: non-NULL value to return from io_loop().
static void finish_waker(struct io_conn *conn, struct data *d)
{
+ ok1(io_is_idle(idler));
io_wake(idler, io_read(d->buf, sizeof(d->buf), read_done, d));
ok1(d->state == 1);
d->state++;
int fd, status;
/* This is how many tests you plan to run */
- plan_tests(13);
+ plan_tests(14);
d->state = 0;
fd = make_listen_fd(PORT, &addrinfo);
ok1(fd >= 0);
#define PORT "65014"
#endif
-#define is_idle(conn) ((conn)->plan.io == NULL)
-
struct data {
struct io_listener *l;
int state;
d->state++;
/* last one out closes. */
- if (conn == d->c1 && is_idle(d->c2))
+ if (conn == d->c1 && io_is_idle(d->c2))
return io_close();
/* last one out closes. */
- if (conn == d->c2 && is_idle(d->c1))
+ if (conn == d->c2 && io_is_idle(d->c1))
return io_close();
return io_idle();