Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
ccan
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
mirror
ccan
Commits
09989550
Commit
09989550
authored
Oct 14, 2013
by
Rusty Russell
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ccan/io: get rid of io_next(), pass callbacks directly.
Signed-off-by:
Rusty Russell
<
rusty@rustcorp.com.au
>
parent
7a8a585c
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
151 additions
and
142 deletions
+151
-142
ccan/io/_info
ccan/io/_info
+4
-5
ccan/io/benchmarks/run-different-speed.c
ccan/io/benchmarks/run-different-speed.c
+6
-6
ccan/io/benchmarks/run-length-prefix.c
ccan/io/benchmarks/run-length-prefix.c
+8
-8
ccan/io/benchmarks/run-loop.c
ccan/io/benchmarks/run-loop.c
+2
-4
ccan/io/io.c
ccan/io/io.c
+31
-35
ccan/io/io.h
ccan/io/io.h
+79
-63
ccan/io/test/run-01-start-finish.c
ccan/io/test/run-01-start-finish.c
+1
-1
ccan/io/test/run-02-read.c
ccan/io/test/run-02-read.c
+2
-2
ccan/io/test/run-03-readpartial.c
ccan/io/test/run-03-readpartial.c
+2
-2
ccan/io/test/run-04-writepartial.c
ccan/io/test/run-04-writepartial.c
+2
-2
ccan/io/test/run-05-write.c
ccan/io/test/run-05-write.c
+2
-2
ccan/io/test/run-06-idle.c
ccan/io/test/run-06-idle.c
+2
-2
ccan/io/test/run-07-break.c
ccan/io/test/run-07-break.c
+2
-2
ccan/io/test/run-10-many.c
ccan/io/test/run-10-many.c
+4
-4
ccan/io/test/run-12-bidir.c
ccan/io/test/run-12-bidir.c
+2
-2
ccan/io/test/run-15-timeout.c
ccan/io/test/run-15-timeout.c
+2
-2
No files found.
ccan/io/_info
View file @
09989550
...
...
@@ -40,8 +40,7 @@
* {
* assert(c == b->reader);
* b->len = sizeof(b->inbuf);
* return io_read_partial(b->inbuf, &b->len,
* io_next(c, wake_writer, b));
* return io_read_partial(c, b->inbuf, &b->len, wake_writer, b);
* }
*
* static struct io_plan *wake_writer(struct io_conn *c, struct stdin_buffer *b)
...
...
@@ -71,7 +70,7 @@
* assert(conn == b->writer);
* if (!b->reader)
* return io_close(conn, NULL);
* return io_write(
b->inbuf, b->len, io_next(conn, wake_reader, b)
);
* return io_write(
conn, b->inbuf, b->len, wake_reader, b
);
* }
*
* static struct io_plan *start_writer(struct io_conn *conn,
...
...
@@ -104,8 +103,8 @@
* }
*
* b->rlen = b->max - b->off;
* return io_read_partial(b->buf + b->off, &b->rlen,
*
io_next(conn, read_from_child, b)
);
* return io_read_partial(
conn,
b->buf + b->off, &b->rlen,
*
read_from_child, b
);
* }
*
* // Feed a program our stdin, gather its stdout, print that at end.
...
...
ccan/io/benchmarks/run-different-speed.c
View file @
09989550
...
...
@@ -28,8 +28,8 @@ struct client {
static
struct
io_plan
*
write_reply
(
struct
io_conn
*
conn
,
struct
client
*
client
);
static
struct
io_plan
*
read_request
(
struct
io_conn
*
conn
,
struct
client
*
client
)
{
return
io_read
(
client
->
request_buffer
,
REQUEST_SIZE
,
io_next
(
conn
,
write_reply
,
client
)
);
return
io_read
(
c
onn
,
c
lient
->
request_buffer
,
REQUEST_SIZE
,
write_reply
,
client
);
}
/* once we're done, loop again. */
...
...
@@ -41,8 +41,8 @@ static struct io_plan *write_complete(struct io_conn *conn, struct client *clien
static
struct
io_plan
*
write_reply
(
struct
io_conn
*
conn
,
struct
client
*
client
)
{
return
io_write
(
client
->
reply_buffer
,
REPLY_SIZE
,
io_next
(
conn
,
write_complete
,
client
)
);
return
io_write
(
c
onn
,
c
lient
->
reply_buffer
,
REPLY_SIZE
,
write_complete
,
client
);
}
/* This runs in the child. */
...
...
@@ -108,12 +108,12 @@ static void sigalarm(int sig)
static
struct
io_plan
*
do_timeout
(
struct
io_conn
*
conn
,
char
*
buf
)
{
return
io_break
(
conn
,
NULL
);
return
io_break
(
conn
,
buf
,
NULL
,
NULL
);
}
static
struct
io_plan
*
do_timeout_read
(
struct
io_conn
*
conn
,
char
*
buf
)
{
return
io_read
(
buf
,
1
,
io_next
(
conn
,
do_timeout
,
buf
)
);
return
io_read
(
conn
,
buf
,
1
,
do_timeout
,
buf
);
}
int
main
(
int
argc
,
char
*
argv
[])
...
...
ccan/io/benchmarks/run-length-prefix.c
View file @
09989550
...
...
@@ -29,14 +29,14 @@ static struct io_plan *write_reply(struct io_conn *conn, struct client *client);
static
struct
io_plan
*
read_body
(
struct
io_conn
*
conn
,
struct
client
*
client
)
{
assert
(
client
->
len
<=
REQUEST_MAX
);
return
io_read
(
client
->
request_buffer
,
client
->
len
,
io_next
(
conn
,
write_reply
,
client
)
);
return
io_read
(
c
onn
,
c
lient
->
request_buffer
,
client
->
len
,
write_reply
,
client
);
}
static
struct
io_plan
*
read_header
(
struct
io_conn
*
conn
,
struct
client
*
client
)
{
return
io_read
(
&
client
->
len
,
sizeof
(
client
->
len
),
io_next
(
conn
,
read_body
,
client
)
);
return
io_read
(
conn
,
&
client
->
len
,
sizeof
(
client
->
len
),
read_body
,
client
);
}
/* once we're done, loop again. */
...
...
@@ -48,8 +48,8 @@ static struct io_plan *write_complete(struct io_conn *conn, struct client *clien
static
struct
io_plan
*
write_reply
(
struct
io_conn
*
conn
,
struct
client
*
client
)
{
return
io_write
(
&
client
->
len
,
sizeof
(
client
->
len
),
io_next
(
conn
,
write_complete
,
client
)
);
return
io_write
(
conn
,
&
client
->
len
,
sizeof
(
client
->
len
),
write_complete
,
client
);
}
/* This runs in the child. */
...
...
@@ -114,12 +114,12 @@ static void sigalarm(int sig)
static
struct
io_plan
*
do_timeout
(
struct
io_conn
*
conn
,
char
*
buf
)
{
return
io_break
(
conn
,
NULL
);
return
io_break
(
conn
,
buf
,
NULL
,
NULL
);
}
static
struct
io_plan
*
do_timeout_read
(
struct
io_conn
*
conn
,
char
*
buf
)
{
return
io_read
(
buf
,
1
,
io_next
(
conn
,
do_timeout
,
buf
)
);
return
io_read
(
conn
,
buf
,
1
,
do_timeout
,
buf
);
}
int
main
(
int
argc
,
char
*
argv
[])
...
...
ccan/io/benchmarks/run-loop.c
View file @
09989550
...
...
@@ -23,16 +23,14 @@ static struct io_plan *do_read(struct io_conn *conn, struct buffer *buf)
{
assert
(
conn
==
buf
->
reader
);
return
io_read
(
&
buf
->
buf
,
sizeof
(
buf
->
buf
),
io_next
(
conn
,
poke_writer
,
buf
));
return
io_read
(
conn
,
&
buf
->
buf
,
sizeof
(
buf
->
buf
),
poke_writer
,
buf
);
}
static
struct
io_plan
*
do_write
(
struct
io_conn
*
conn
,
struct
buffer
*
buf
)
{
assert
(
conn
==
buf
->
writer
);
return
io_write
(
&
buf
->
buf
,
sizeof
(
buf
->
buf
),
io_next
(
conn
,
poke_reader
,
buf
));
return
io_write
(
conn
,
&
buf
->
buf
,
sizeof
(
buf
->
buf
),
poke_reader
,
buf
);
}
static
struct
io_plan
*
poke_writer
(
struct
io_conn
*
conn
,
struct
buffer
*
buf
)
...
...
ccan/io/io.c
View file @
09989550
...
...
@@ -95,34 +95,13 @@ struct io_conn *io_duplex_(struct io_conn *old,
return
conn
;
}
/* Convenient token which only we can produce. */
static
inline
struct
io_next
*
to_ionext
(
struct
io_conn
*
conn
)
{
return
(
struct
io_next
*
)
conn
;
}
static
inline
struct
io_plan
*
to_ioplan
(
enum
io_state
state
)
{
return
(
struct
io_plan
*
)(
long
)
state
;
}
static
inline
struct
io_conn
*
from_ionext
(
struct
io_next
*
next
)
{
return
(
struct
io_conn
*
)
next
;
}
struct
io_next
*
io_next_
(
struct
io_conn
*
conn
,
struct
io_plan
*
(
*
next
)(
struct
io_conn
*
,
void
*
),
void
*
arg
)
{
conn
->
fd
.
next
=
next
;
conn
->
fd
.
next_arg
=
arg
;
return
to_ionext
(
conn
);
}
bool
io_timeout_
(
struct
io_conn
*
conn
,
struct
timespec
ts
,
struct
io_plan
*
(
*
next
)(
struct
io_conn
*
,
void
*
),
void
*
arg
)
struct
io_plan
*
(
*
cb
)(
struct
io_conn
*
,
void
*
),
void
*
arg
)
{
if
(
!
conn
->
timeout
)
{
conn
->
timeout
=
malloc
(
sizeof
(
*
conn
->
timeout
));
...
...
@@ -131,45 +110,58 @@ bool io_timeout_(struct io_conn *conn, struct timespec ts,
}
else
assert
(
!
timeout_active
(
conn
));
conn
->
timeout
->
next
=
next
;
conn
->
timeout
->
next
=
cb
;
conn
->
timeout
->
next_arg
=
arg
;
backend_add_timeout
(
conn
,
ts
);
return
true
;
}
/* Queue some data to be written. */
struct
io_plan
*
io_write
(
const
void
*
data
,
size_t
len
,
struct
io_next
*
next
)
struct
io_plan
*
io_write_
(
struct
io_conn
*
conn
,
const
void
*
data
,
size_t
len
,
struct
io_plan
*
(
*
cb
)(
struct
io_conn
*
,
void
*
),
void
*
arg
)
{
struct
io_conn
*
conn
=
from_ionext
(
next
);
conn
->
u
.
write
.
buf
=
data
;
conn
->
u
.
write
.
len
=
len
;
conn
->
fd
.
next
=
cb
;
conn
->
fd
.
next_arg
=
arg
;
return
to_ioplan
(
WRITE
);
}
/* Queue a request to read into a buffer. */
struct
io_plan
*
io_read
(
void
*
data
,
size_t
len
,
struct
io_next
*
next
)
struct
io_plan
*
io_read_
(
struct
io_conn
*
conn
,
void
*
data
,
size_t
len
,
struct
io_plan
*
(
*
cb
)(
struct
io_conn
*
,
void
*
),
void
*
arg
)
{
struct
io_conn
*
conn
=
from_ionext
(
next
);
conn
->
u
.
read
.
buf
=
data
;
conn
->
u
.
read
.
len
=
len
;
conn
->
fd
.
next
=
cb
;
conn
->
fd
.
next_arg
=
arg
;
return
to_ioplan
(
READ
);
}
/* Queue a partial request to read into a buffer. */
struct
io_plan
*
io_read_partial
(
void
*
data
,
size_t
*
len
,
struct
io_next
*
next
)
struct
io_plan
*
io_read_partial_
(
struct
io_conn
*
conn
,
void
*
data
,
size_t
*
len
,
struct
io_plan
*
(
*
cb
)(
struct
io_conn
*
,
void
*
),
void
*
arg
)
{
struct
io_conn
*
conn
=
from_ionext
(
next
);
conn
->
u
.
readpart
.
buf
=
data
;
conn
->
u
.
readpart
.
lenp
=
len
;
conn
->
fd
.
next
=
cb
;
conn
->
fd
.
next_arg
=
arg
;
return
to_ioplan
(
READPART
);
}
/* Queue a partial write request. */
struct
io_plan
*
io_write_partial
(
const
void
*
data
,
size_t
*
len
,
struct
io_next
*
next
)
struct
io_plan
*
io_write_partial_
(
struct
io_conn
*
conn
,
const
void
*
data
,
size_t
*
len
,
struct
io_plan
*
(
*
cb
)(
struct
io_conn
*
,
void
*
),
void
*
arg
)
{
struct
io_conn
*
conn
=
from_ionext
(
next
);
conn
->
u
.
writepart
.
buf
=
data
;
conn
->
u
.
writepart
.
lenp
=
len
;
conn
->
fd
.
next
=
cb
;
conn
->
fd
.
next_arg
=
arg
;
return
to_ioplan
(
WRITEPART
);
}
...
...
@@ -179,14 +171,14 @@ struct io_plan *io_idle(struct io_conn *conn)
}
void
io_wake_
(
struct
io_conn
*
conn
,
struct
io_plan
*
(
*
next
)(
struct
io_conn
*
,
void
*
),
void
*
arg
)
struct
io_plan
*
(
*
fn
)(
struct
io_conn
*
,
void
*
),
void
*
arg
)
{
/* It might have finished, but we haven't called its finish() yet. */
if
(
conn
->
state
==
FINISHED
)
return
;
assert
(
conn
->
state
==
IDLE
);
conn
->
fd
.
next
=
next
;
conn
->
fd
.
next
=
fn
;
conn
->
fd
.
next_arg
=
arg
;
backend_set_state
(
conn
,
to_ioplan
(
NEXT
));
}
...
...
@@ -254,9 +246,13 @@ struct io_plan *io_close(struct io_conn *conn, void *arg)
}
/* Exit the loop, returning this (non-NULL) arg. */
struct
io_plan
*
io_break
(
void
*
arg
,
struct
io_next
*
next
)
struct
io_plan
*
io_break_
(
struct
io_conn
*
conn
,
void
*
ret
,
struct
io_plan
*
(
*
fn
)(
struct
io_conn
*
,
void
*
),
void
*
arg
)
{
io_loop_return
=
arg
;
io_loop_return
=
ret
;
conn
->
fd
.
next
=
fn
;
conn
->
fd
.
next_arg
=
arg
;
return
to_ioplan
(
NEXT
);
}
ccan/io/io.h
View file @
09989550
...
...
@@ -13,13 +13,6 @@
*/
struct
io_plan
;
/**
* struct io_next - pointer to what we're going to do next.
*
* Bundles up callbacks, generated by io_next().
*/
struct
io_next
;
/**
* io_new_conn - create a new connection.
* @fd: the file descriptor.
...
...
@@ -86,60 +79,98 @@ void io_close_listener(struct io_listener *listener);
/**
* io_write - queue data to be written.
* @conn: the current connection.
* @data: the data buffer.
* @len: the length to write.
* @next: what to call next.
* @cb: function to call once it's done.
* @arg: @cb argument
*
* This will queue the data buffer for writing. Once it's all
written, the
*
function registered with io_next()
will be called: on an error, the finish
* This will queue the data buffer for writing. Once it's all
*
written, the @cb function
will be called: on an error, the finish
* function is called instead.
*
* Note that the I/O may actually be done immediately.
*/
struct
io_plan
*
io_write
(
const
void
*
data
,
size_t
len
,
struct
io_next
*
next
);
#define io_write(conn, data, len, cb, arg) \
io_write_((conn), (data), (len), \
typesafe_cb_preargs(struct io_plan *, void *, \
(cb), (arg), struct io_conn *), \
(arg))
struct
io_plan
*
io_write_
(
struct
io_conn
*
conn
,
const
void
*
data
,
size_t
len
,
struct
io_plan
*
(
*
cb
)(
struct
io_conn
*
,
void
*
),
void
*
arg
);
/**
* io_read - queue buffer to be read.
* @conn: the current connection.
* @data: the data buffer.
* @len: the length to read.
* @next: what to call next.
* @cb: function to call once it's done.
* @arg: @cb argument
*
* This will queue the data buffer for reading. Once it's all read,
the
*
function registered with io_next() will be called: on an error, the finish
*
function
is called instead.
* This will queue the data buffer for reading. Once it's all read,
*
the @cb function will be called: on an error, the finish function
* is called instead.
*
* Note that the I/O may actually be done immediately.
*/
struct
io_plan
*
io_read
(
void
*
data
,
size_t
len
,
struct
io_next
*
next
);
#define io_read(conn, data, len, cb, arg) \
io_read_((conn), (data), (len), \
typesafe_cb_preargs(struct io_plan *, void *, \
(cb), (arg), struct io_conn *), \
(arg))
struct
io_plan
*
io_read_
(
struct
io_conn
*
conn
,
void
*
data
,
size_t
len
,
struct
io_plan
*
(
*
cb
)(
struct
io_conn
*
,
void
*
),
void
*
arg
);
/**
* io_read_partial - queue buffer to be read (partial OK).
* @conn: the current connection.
* @data: the data buffer.
* @len: the maximum length to read, set to the length actually read.
* @next: what to call next.
* @cb: function to call once it's done.
* @arg: @cb argument
*
* This will queue the data buffer for reading. Once any data is
* read, @len is updated and the
function registered with io_next()
*
will be called: on an
error, the finish function is called instead.
* read, @len is updated and the
@cb function will be called: on an
* error, the finish function is called instead.
*
* Note that the I/O may actually be done immediately.
*/
struct
io_plan
*
io_read_partial
(
void
*
data
,
size_t
*
len
,
struct
io_next
*
next
);
#define io_read_partial(conn, data, len, cb, arg) \
io_read_partial_((conn), (data), (len), \
typesafe_cb_preargs(struct io_plan *, void *, \
(cb), (arg), struct io_conn *), \
(arg))
struct
io_plan
*
io_read_partial_
(
struct
io_conn
*
conn
,
void
*
data
,
size_t
*
len
,
struct
io_plan
*
(
*
cb
)(
struct
io_conn
*
,
void
*
),
void
*
arg
);
/**
* io_write_partial - queue data to be written (partial OK).
* @conn: the current connection.
* @data: the data buffer.
* @len: the maximum length to write, set to the length actually written.
* @next: what to call next.
* @cb: function to call once it's done.
* @arg: @cb argument
*
* This will queue the data buffer for writing. Once any data is
* written, @len is updated and the
function registered with io_next()
*
will be called: on an
error, the finish function is called instead.
* written, @len is updated and the
@cb function will be called: on an
* error, the finish function is called instead.
*
* Note that the I/O may actually be done immediately.
*/
struct
io_plan
*
io_write_partial
(
const
void
*
data
,
size_t
*
len
,
struct
io_next
*
next
);
#define io_write_partial(conn, data, len, cb, arg) \
io_write_partial_((conn), (data), (len), \
typesafe_cb_preargs(struct io_plan *, void *, \
(cb), (arg), struct io_conn *), \
(arg))
struct
io_plan
*
io_write_partial_
(
struct
io_conn
*
conn
,
const
void
*
data
,
size_t
*
len
,
struct
io_plan
*
(
*
cb
)(
struct
io_conn
*
,
void
*
),
void
*
arg
);
/**
* io_idle - explicitly note that this connection will do nothing.
...
...
@@ -155,8 +186,8 @@ struct io_plan *io_idle(struct io_conn *conn);
* io_timeout - set timeout function if the callback doesn't fire.
* @conn: the current connection.
* @ts: how long until the timeout should be called.
* @
next: function
to call.
* @arg: argument to @
next
.
* @
cb
to call.
* @arg: argument to @
cb
.
*
* If the usual next callback is not called for this connection before @ts,
* this function will be called. If next callback is called, the timeout
...
...
@@ -165,15 +196,14 @@ struct io_plan *io_idle(struct io_conn *conn);
* Returns false on allocation failure. A connection can only have one
* timeout.
*/
#define io_timeout(conn, ts,
next, arg)
\
#define io_timeout(conn, ts,
fn, arg)
\
io_timeout_((conn), (ts), \
typesafe_cb_preargs(struct io_plan *, void *, \
(
next
), (arg), \
(
fn
), (arg), \
struct io_conn *), \
(arg))
bool
io_timeout_
(
struct
io_conn
*
conn
,
struct
timespec
ts
,
struct
io_plan
*
(
*
next
)(
struct
io_conn
*
,
void
*
),
void
*
arg
);
struct
io_plan
*
(
*
fn
)(
struct
io_conn
*
,
void
*
),
void
*
arg
);
/**
* io_duplex - split an fd into two connections.
...
...
@@ -205,55 +235,41 @@ struct io_conn *io_duplex_(struct io_conn *conn,
/**
* io_wake - wake up and idle connection.
* @conn: an idle connection.
* @
next
: the next function to call once queued IO is complete.
* @
fn
: the next function to call once queued IO is complete.
* @arg: the argument to @next.
*
* This makes @conn run its @next function the next time around the
* io_loop().
*/
#define io_wake(conn,
next, arg)
\
#define io_wake(conn,
fn, arg)
\
io_wake_((conn), \
typesafe_cb_preargs(struct io_plan *, void *, \
(
next
), (arg), struct io_conn *), \
(
fn
), (arg), struct io_conn *), \
(arg))
void
io_wake_
(
struct
io_conn
*
conn
,
struct
io_plan
*
(
*
next
)(
struct
io_conn
*
,
void
*
),
void
*
arg
);
struct
io_plan
*
(
*
fn
)(
struct
io_conn
*
,
void
*
),
void
*
arg
);
/**
* io_break - return from io_loop()
* @arg: non-NULL value to return from io_loop().
* @next: what to call next (can be NULL if we expect no return).
* @conn: the current connection.
* @ret: non-NULL value to return from io_loop().
* @cb: function to call once on return
* @arg: @cb argument
*
* This breaks out of the io_loop. As soon as the current @next
* function returns, any io_closed()'d connections will have their
* finish callbacks called, then io_loop() with return with @
arg
.
* finish callbacks called, then io_loop() with return with @
ret
.
*
* If io_loop() is called again, then @
next
will be called.
* If io_loop() is called again, then @
cb
will be called.
*/
struct
io_plan
*
io_break
(
void
*
arg
,
struct
io_next
*
next
);
/**
* io_next - indicate what callback to call next.
* @conn: this connection.
* @next: the next function to call once queued IO is complete.
* @arg: the argument to @next.
*
* Every @next (or @start) function should "return io_next(...);" once
* they have indicated what io to perform (eg. io_write, io_idle).
* The exception is io_close(), which can be used instead of io_next().
*
* Note that as an optimization, the next function may be called
* immediately, which is why this should be the last statement in your
* function.
*/
#define io_next(conn, next, arg) \
io_next_((conn), \
typesafe_cb_preargs(struct io_plan *, void *, \
(next), (arg), struct io_conn *), \
(arg))
struct
io_next
*
io_next_
(
struct
io_conn
*
conn
,
struct
io_plan
*
(
*
next
)(
struct
io_conn
*
,
void
*
arg
),
void
*
arg
);
#define io_break(conn, ret, fn, arg) \
io_break_((conn), (ret), \
typesafe_cb_preargs(struct io_plan *, void *, \
(fn), (arg), struct io_conn *), \
(arg))
struct
io_plan
*
io_break_
(
struct
io_conn
*
conn
,
void
*
ret
,
struct
io_plan
*
(
*
fn
)(
struct
io_conn
*
,
void
*
),
void
*
arg
);
/* FIXME: io_recvfrom/io_sendto */
...
...
ccan/io/test/run-01-start-finish.c
View file @
09989550
...
...
@@ -17,7 +17,7 @@ static void finish_ok(struct io_conn *conn, int *state)
{
ok1
(
*
state
==
1
);
(
*
state
)
++
;
io_break
(
state
+
1
,
NULL
);
io_break
(
conn
,
state
+
1
,
NULL
,
NULL
);
}
static
int
make_listen_fd
(
const
char
*
port
,
struct
addrinfo
**
info
)
...
...
ccan/io/test/run-02-read.c
View file @
09989550
...
...
@@ -15,14 +15,14 @@ static struct io_plan *start_ok(struct io_conn *conn, struct data *d)
{
ok1
(
d
->
state
==
0
);
d
->
state
++
;
return
io_read
(
d
->
buf
,
sizeof
(
d
->
buf
),
io_next
(
conn
,
io_close
,
d
)
);
return
io_read
(
conn
,
d
->
buf
,
sizeof
(
d
->
buf
),
io_close
,
d
);
}
static
void
finish_ok
(
struct
io_conn
*
conn
,
struct
data
*
d
)
{
ok1
(
d
->
state
==
1
);
d
->
state
++
;
io_break
(
d
,
NULL
);
io_break
(
conn
,
d
,
NULL
,
NULL
);
}
static
int
make_listen_fd
(
const
char
*
port
,
struct
addrinfo
**
info
)
...
...
ccan/io/test/run-03-readpartial.c
View file @
09989550
...
...
@@ -17,14 +17,14 @@ static struct io_plan *start_ok(struct io_conn *conn, struct data *d)
ok1
(
d
->
state
==
0
);
d
->
state
++
;
d
->
bytes
=
sizeof
(
d
->
buf
);
return
io_read_partial
(
d
->
buf
,
&
d
->
bytes
,
io_next
(
conn
,
io_close
,
d
)
);
return
io_read_partial
(
conn
,
d
->
buf
,
&
d
->
bytes
,
io_close
,
d
);
}
static
void
finish_ok
(
struct
io_conn
*
conn
,
struct
data
*
d
)
{
ok1
(
d
->
state
==
1
);
d
->
state
++
;
io_break
(
d
,
NULL
);
io_break
(
conn
,
d
,
NULL
,
NULL
);
}
static
int
make_listen_fd
(
const
char
*
port
,
struct
addrinfo
**
info
)
...
...
ccan/io/test/run-04-writepartial.c
View file @
09989550
...
...
@@ -16,14 +16,14 @@ static struct io_plan *start_ok(struct io_conn *conn, struct data *d)
{
ok1
(
d
->
state
==
0
);
d
->
state
++
;
return
io_write_partial
(
d
->
buf
,
&
d
->
bytes
,
io_next
(
conn
,
io_close
,
d
)
);
return
io_write_partial
(
conn
,
d
->
buf
,
&
d
->
bytes
,
io_close
,
d
);
}
static
void
finish_ok
(
struct
io_conn
*
conn
,
struct
data
*
d
)
{
ok1
(
d
->
state
==
1
);
d
->
state
++
;
io_break
(
d
,
NULL
);
io_break
(
conn
,
d
,
NULL
,
NULL
);
}
static
int
make_listen_fd
(
const
char
*
port
,
struct
addrinfo
**
info
)
...
...
ccan/io/test/run-05-write.c
View file @
09989550
...
...
@@ -16,14 +16,14 @@ static struct io_plan *start_ok(struct io_conn *conn, struct data *d)
{
ok1
(
d
->
state
==
0
);
d
->
state
++
;
return
io_write
(
d
->
buf
,
d
->
bytes
,
io_next
(
conn
,
io_close
,
d
)
);
return
io_write
(
conn
,
d
->
buf
,
d
->
bytes
,
io_close
,
d
);
}
static
void
finish_ok
(
struct
io_conn
*
conn
,
struct
data
*
d
)
{
ok1
(
d
->
state
==
1
);
d
->
state
++
;
io_break
(
d
,
NULL
);
io_break
(
conn
,
d
,
NULL
,
NULL
);
}
static
int
make_listen_fd
(
const
char
*
port
,
struct
addrinfo
**
info
)
...
...
ccan/io/test/run-06-idle.c
View file @
09989550
...
...
@@ -20,7 +20,7 @@ static struct io_plan *do_read(struct io_conn *conn, struct data *d)
{
ok1
(
d
->
state
==
2
||
d
->
state
==
3
);
d
->
state
++
;
return
io_read
(
d
->
buf
,
sizeof
(
d
->
buf
),
io_next
(
conn
,
io_close
,
d
)
);
return
io_read
(
conn
,
d
->
buf
,
sizeof
(
d
->
buf
),
io_close
,
d
);
}
static
struct
io_plan
*
start_waker
(
struct
io_conn
*
conn
,
struct
data
*
d
)
...
...
@@ -58,7 +58,7 @@ static void finish_idle(struct io_conn *conn, struct data *d)
{
ok1
(
d
->
state
==
4
);
d
->
state
++
;
io_break
(
d
,
NULL
);
io_break
(
conn
,
d
,
NULL
,
NULL
);
}
static
int
make_listen_fd
(
const
char
*
port
,
struct
addrinfo
**
info
)
...
...
ccan/io/test/run-07-break.c
View file @
09989550
...
...
@@ -15,14 +15,14 @@ static struct io_plan *do_read(struct io_conn *conn, struct data *d)
{
ok1
(
d
->
state
==
1
);
d
->
state
++
;
return
io_read
(
d
->
buf
,
sizeof
(
d
->
buf
),
io_next
(
conn
,
io_close
,
d
)
);
return
io_read
(
conn
,
d
->
buf
,
sizeof
(
d
->
buf
),
io_close
,
d
);
}
static
struct
io_plan
*
start_break
(
struct
io_conn
*
conn
,
struct
data
*
d
)
{
ok1
(
d
->
state
==
0
);
d
->
state
++
;
return
io_break
(
d
,
io_next
(
conn
,
do_read
,
d
)
);
return
io_break
(
conn
,
d
,
do_read
,
d
);
}
static
void
finish_ok
(
struct
io_conn
*
conn
,
struct
data
*
d
)
...
...
ccan/io/test/run-10-many.c
View file @
09989550
...
...
@@ -22,16 +22,16 @@ static struct io_plan *do_read(struct io_conn *conn, struct buffer *buf)
{
assert
(
conn
==
buf
->
reader
);
return
io_read
(
&
buf
->
buf
,
sizeof
(
buf
->
buf
),
io_next
(
conn
,
poke_writer
,
buf
)
);
return
io_read
(
conn
,
&
buf
->
buf
,
sizeof
(
buf
->
buf
),
poke_writer
,
buf
);
}
static
struct
io_plan
*
do_write
(
struct
io_conn
*
conn
,
struct
buffer
*
buf
)
{
assert
(
conn
==
buf
->
writer
);
return
io_write
(
&
buf
->
buf
,
sizeof
(
buf
->
buf
),
io_next
(
conn
,
poke_reader
,
buf
)
);
return
io_write
(
conn
,
&
buf
->
buf
,
sizeof
(
buf
->
buf
),
poke_reader
,
buf
);
}
static
struct
io_plan
*
poke_writer
(
struct
io_conn
*
conn
,
struct
buffer
*
buf
)
...
...
ccan/io/test/run-12-bidir.c
View file @
09989550
...
...
@@ -21,7 +21,7 @@ static void finish_ok(struct io_conn *conn, struct data *d)
static
struct
io_plan
*
write_out
(
struct
io_conn
*
conn
,
struct
data
*
d
)
{
d
->
state
++
;
return
io_write
(
d
->
wbuf
,
sizeof
(
d
->
wbuf
),
io_next
(
conn
,
io_close
,
d
)
);
return
io_write
(
conn
,
d
->
wbuf
,
sizeof
(
d
->
wbuf
),
io_close
,
d
);
}
static
struct
io_plan
*
start_ok
(
struct
io_conn
*
conn
,
struct
data
*
d
)
...
...
@@ -33,7 +33,7 @@ static struct io_plan *start_ok(struct io_conn *conn, struct data *d)
memset
(
d
->
wbuf
,
7
,
sizeof
(
d
->
wbuf
));
ok1
(
io_duplex
(
conn
,
write_out
,
finish_ok
,
d
));
return
io_read
(
d
->
buf
,
sizeof
(
d
->
buf
),
io_next
(
conn
,
io_close
,
d
)
);
return
io_read
(
conn
,
d
->
buf
,
sizeof
(
d
->
buf
),
io_close
,
d
);
}
static
int
make_listen_fd
(
const
char
*
port
,
struct
addrinfo
**
info
)
...
...
ccan/io/test/run-15-timeout.c
View file @
09989550
...
...
@@ -35,14 +35,14 @@ static struct io_plan *start_ok(struct io_conn *conn, struct data *d)
ok1
(
d
->
state
==
0
);
d
->
state
++
;
io_timeout
(
conn
,
time_from_usec
(
d
->
timeout_usec
),
timeout
,
d
);
return
io_read
(
d
->
buf
,
sizeof
(
d
->
buf
),
io_next
(
conn
,
no_timeout
,
d
)
);
return
io_read
(
conn
,
d
->
buf
,
sizeof
(
d
->
buf
),
no_timeout
,
d
);
}
static
void
finish_ok
(
struct
io_conn
*
conn
,
struct
data
*
d
)
{
ok1
(
d
->
state
==
2
);
d
->
state
++
;
io_break
(
d
,
NULL
);
io_break
(
conn
,
d
,
NULL
,
NULL
);
}
static
int
make_listen_fd
(
const
char
*
port
,
struct
addrinfo
**
info
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment