Merge branch 'master' of ozlabs.org:ccan
authorRusty Russell <rusty@rustcorp.com.au>
Tue, 12 Nov 2013 10:12:01 +0000 (20:42 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Tue, 12 Nov 2013 10:12:01 +0000 (20:42 +1030)
ccan/io/io.c
ccan/io/io.h
ccan/io/test/run-12-bidir.c
ccan/list/list.h
ccan/list/test/run-list_prev-list_next.c

index f45589c0fac71888b1be312debcb3ec04597b0bb..b74520444353761451529af0d0467522293f2686 100644 (file)
@@ -46,6 +46,12 @@ struct io_plan io_debug(struct io_plan plan)
        current->plan = plan;
        backend_plan_changed(current);
 
+       /* If it closed, close duplex. */
+       if (!current->plan.next && current->duplex) {
+               current->duplex->plan = io_close_();
+               backend_plan_changed(current->duplex);
+       }
+
        /* Call back into the loop immediately. */
        io_loop_return = do_io_loop(&ready);
 
@@ -441,6 +447,14 @@ void io_ready(struct io_conn *conn)
                backend_plan_changed(conn);
        }
        set_current(NULL);
+
+       /* If it closed, close duplex. */
+       if (!conn->plan.next && conn->duplex) {
+               set_current(conn->duplex);
+               conn->duplex->plan = io_close();
+               backend_plan_changed(conn->duplex);
+               set_current(NULL);
+       }
 }
 
 /* Close the connection, we're done. */
index 6248fec02c2e5c5ae3d42e65d80eb8483af1d5aa..0318aef300873fa71104e0a2b630ad28e93e7065 100644 (file)
@@ -394,7 +394,7 @@ bool io_timeout_(struct io_conn *conn, struct timespec ts,
  * to have two connections for the same fd, and use one for read
  * operations and one for write.
  *
- * You must io_close() both of them to close the fd.
+ * Returning io_close() on one will close both fds!
  *
  * Example:
  *     static void setup_read_write(int fd,
index 1ab0a218d02a200e7918a079966d7eda941cd4c6..f7a0ecab7f3871045458e4886c6653e865f0ec5f 100644 (file)
@@ -25,7 +25,7 @@ static void finish_ok(struct io_conn *conn, struct data *d)
 static struct io_plan write_done(struct io_conn *conn, struct data *d)
 {
        d->state++;
-       return io_close();
+       return io_idle();
 }
 
 static void init_conn(int fd, struct data *d)
index 03614873ef6a718aaaadec32a27356f82c6c7912..3153d550824b9b8dd7940b02e4bb414cbffb2aa9 100644 (file)
@@ -604,8 +604,8 @@ static inline struct list_node *list_node_from_off_(void *ptr, size_t off)
 #endif
 
 /* Returns member, or NULL if at end of list. */
-static inline void *list_entry_or_null(struct list_head *h,
-                                      struct list_node *n,
+static inline void *list_entry_or_null(const struct list_head *h,
+                                      const struct list_node *n,
                                       size_t off)
 {
        if (n == &h->n)
index 85611d9d74863d0f1cd841040fcd2085ccc797fd..b496f11f84d8bea54191be4ff4069882be5aa3f9 100644 (file)
@@ -18,8 +18,10 @@ int main(int argc, char *argv[])
 {
        struct parent parent;
        struct child c1, c2, c3;
+       const struct parent *p;
+       const struct child *c;
 
-       plan_tests(12);
+       plan_tests(20);
        parent.num_children = 0;
        list_head_init(&parent.children);
 
@@ -46,5 +48,18 @@ int main(int argc, char *argv[])
        ok1(list_prev(&parent.children, &c2, list) == &c1);
        ok1(list_next(&parent.children, &c3, list) == NULL);
        ok1(list_prev(&parent.children, &c3, list) == &c2);
+
+       /* Const variants */
+       p = &parent;
+       c = &c2;
+       ok1(list_next(&p->children, &c1, list) == &c2);
+       ok1(list_prev(&p->children, &c1, list) == NULL);
+       ok1(list_next(&p->children, c, list) == &c3);
+       ok1(list_prev(&p->children, c, list) == &c1);
+       ok1(list_next(&parent.children, c, list) == &c3);
+       ok1(list_prev(&parent.children, c, list) == &c1);
+       ok1(list_next(&p->children, &c3, list) == NULL);
+       ok1(list_prev(&p->children, &c3, list) == &c2);
+
        return exit_status();
 }