Browse Source

io: don't do wakeup immediately.

ccan/io users don't expect to deal with callbacks inside each other; we should
just mark woken connections as if they were io_always.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 11 years ago
parent
commit
8d94c52a7d
3 changed files with 8 additions and 5 deletions
  1. 1 1
      ccan/io/backend.h
  2. 5 2
      ccan/io/io.c
  3. 2 2
      ccan/io/poll.c

+ 1 - 1
ccan/io/backend.h

@@ -88,6 +88,6 @@ void backend_del_conn(struct io_conn *conn);
 
 void io_ready(struct io_conn *conn, int pollflags);
 void io_do_always(struct io_conn *conn);
-void io_do_wakeup(struct io_conn *conn, struct io_plan *plan);
+void io_do_wakeup(struct io_conn *conn, enum io_direction dir);
 void *do_io_loop(struct io_conn **ready);
 #endif /* CCAN_IO_BACKEND_H */

+ 5 - 2
ccan/io/io.c

@@ -384,10 +384,13 @@ void io_do_always(struct io_conn *conn)
 		next_plan(conn, &conn->plan[IO_OUT]);
 }
 
-void io_do_wakeup(struct io_conn *conn, struct io_plan *plan)
+void io_do_wakeup(struct io_conn *conn, enum io_direction dir)
 {
+	struct io_plan *plan = &conn->plan[dir];
+
 	assert(plan->status == IO_WAITING);
-	next_plan(conn, plan);
+
+	set_always(conn, dir, plan->next, plan->next_arg);
 }
 
 /* Close the connection, we're done. */

+ 2 - 2
ccan/io/poll.c

@@ -158,11 +158,11 @@ void backend_wake(const void *wait)
 		c = (void *)fds[i];
 		if (c->plan[IO_IN].status == IO_WAITING
 		    && c->plan[IO_IN].arg.u1.const_vp == wait)
-			io_do_wakeup(c, &c->plan[IO_IN]);
+			io_do_wakeup(c, IO_IN);
 
 		if (c->plan[IO_OUT].status == IO_WAITING
 		    && c->plan[IO_OUT].arg.u1.const_vp == wait)
-			io_do_wakeup(c, &c->plan[IO_OUT]);
+			io_do_wakeup(c, IO_OUT);
 	}
 }