Browse Source

io: closing one side of a duplex connection closes both.

Otherwise, it's a PITA to close a duplexed connection.  If necessary we
can introduce a half-close to de-deplex later.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 12 years ago
parent
commit
490b63852f
3 changed files with 16 additions and 2 deletions
  1. 14 0
      ccan/io/io.c
  2. 1 1
      ccan/io/io.h
  3. 1 1
      ccan/io/test/run-12-bidir.c

+ 14 - 0
ccan/io/io.c

@@ -46,6 +46,12 @@ struct io_plan io_debug(struct io_plan plan)
 	current->plan = plan;
 	current->plan = plan;
 	backend_plan_changed(current);
 	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. */
 	/* Call back into the loop immediately. */
 	io_loop_return = do_io_loop(&ready);
 	io_loop_return = do_io_loop(&ready);
 
 
@@ -441,6 +447,14 @@ void io_ready(struct io_conn *conn)
 		backend_plan_changed(conn);
 		backend_plan_changed(conn);
 	}
 	}
 	set_current(NULL);
 	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. */
 /* Close the connection, we're done. */

+ 1 - 1
ccan/io/io.h

@@ -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
  * to have two connections for the same fd, and use one for read
  * operations and one for write.
  * 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:
  * Example:
  *	static void setup_read_write(int fd,
  *	static void setup_read_write(int fd,

+ 1 - 1
ccan/io/test/run-12-bidir.c

@@ -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)
 static struct io_plan write_done(struct io_conn *conn, struct data *d)
 {
 {
 	d->state++;
 	d->state++;
-	return io_close();
+	return io_idle();
 }
 }
 
 
 static void init_conn(int fd, struct data *d)
 static void init_conn(int fd, struct data *d)