io: add io_is_idle().
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 14 Nov 2013 02:29:21 +0000 (12:59 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 14 Nov 2013 02:29:21 +0000 (12:59 +1030)
Turns out to be useful for complex cases.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/io/io.c
ccan/io/io.h
ccan/io/test/run-06-idle.c
ccan/io/test/run-14-duplex-both-read.c

index 83104f86b43ddfceed6d5bf7938a60d28ac159f2..54ba7da529ec433661163f2d01fb4ab335562fa8 100644 (file)
@@ -418,6 +418,11 @@ struct io_plan io_idle_(void)
        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)
 
 {
index 0318aef300873fa71104e0a2b630ad28e93e7065..df0764bd17e1ff7f50633ffe91a45de4c02c6a22 100644 (file)
@@ -431,6 +431,21 @@ struct io_conn *io_duplex_(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().
index 51cca961a077416c47287a5b78d697cd5513d554..455b8608f1cae1723763154a5bb918d1b5a46a11 100644 (file)
@@ -29,6 +29,7 @@ static struct io_plan read_done(struct io_conn *conn, struct data *d)
 
 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++;
@@ -102,7 +103,7 @@ int main(void)
        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);
index 366f1d44bbaafdf65c09baa1942a490df6c60053..70bdec0ad39a502967cc6aaa50c9387c97bd0d4d 100644 (file)
@@ -12,8 +12,6 @@
 #define PORT "65014"
 #endif
 
-#define is_idle(conn) ((conn)->plan.io == NULL)
-
 struct data {
        struct io_listener *l;
        int state;
@@ -32,11 +30,11 @@ static struct io_plan end(struct io_conn *conn, struct data *d)
        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();