From: Ben Pfaff Date: Thu, 18 Mar 2010 19:59:32 +0000 (-0700) Subject: stream: Generalize stream_open_block(). X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=766407ea9011d347d577a3409acb0f8d34cc72e1;p=openvswitch stream: Generalize stream_open_block(). This change makes it possible to separate opening a stream from blocking on connection completion. This avoids some code redundancy in an upcoming commit. --- diff --git a/lib/stream.c b/lib/stream.c index ed497d69..7d00cafe 100644 --- a/lib/stream.c +++ b/lib/stream.c @@ -222,13 +222,21 @@ error: return error; } +/* Blocks until a previously started stream connection attempt succeeds or + * fails. 'error' should be the value returned by stream_open() and 'streamp' + * should point to the stream pointer set by stream_open(). Returns 0 if + * successful, otherwise a positive errno value other than EAGAIN or + * EINPROGRESS. If successful, leaves '*streamp' untouched; on error, closes + * '*streamp' and sets '*streamp' to null. + * + * Typical usage: + * error = stream_open_block(stream_open("tcp:1.2.3.4:5", &stream), &stream); + */ int -stream_open_block(const char *name, struct stream **streamp) +stream_open_block(int error, struct stream **streamp) { - struct stream *stream; - int error; + struct stream *stream = *streamp; - error = stream_open(name, &stream); while (error == EAGAIN) { stream_run(stream); stream_run_wait(stream); diff --git a/lib/stream.h b/lib/stream.h index d21de2f7..8c4e78a3 100644 --- a/lib/stream.h +++ b/lib/stream.h @@ -29,7 +29,7 @@ void stream_usage(const char *name, bool active, bool passive, bool bootstrap); /* Bidirectional byte streams. */ int stream_verify_name(const char *name); int stream_open(const char *name, struct stream **); -int stream_open_block(const char *name, struct stream **); +int stream_open_block(int error, struct stream **); void stream_close(struct stream *); const char *stream_get_name(const struct stream *); uint32_t stream_get_remote_ip(const struct stream *); diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c index da7faf61..a17c5aa8 100644 --- a/ovsdb/ovsdb-client.c +++ b/ovsdb/ovsdb-client.c @@ -224,7 +224,7 @@ open_jsonrpc(const char *server) struct stream *stream; int error; - error = stream_open_block(server, &stream); + error = stream_open_block(stream_open(server, &stream), &stream); if (error == EAFNOSUPPORT) { struct pstream *pstream; diff --git a/tests/test-jsonrpc.c b/tests/test-jsonrpc.c index 06b1cf47..f760b3ca 100644 --- a/tests/test-jsonrpc.c +++ b/tests/test-jsonrpc.c @@ -274,7 +274,7 @@ do_request(int argc OVS_UNUSED, char *argv[]) ovs_fatal(0, "not a valid JSON-RPC request: %s", string); } - error = stream_open_block(argv[1], &stream); + error = stream_open_block(stream_open(argv[1], &stream), &stream); if (error) { ovs_fatal(error, "could not open \"%s\"", argv[1]); } @@ -313,7 +313,7 @@ do_notify(int argc OVS_UNUSED, char *argv[]) ovs_fatal(0, "not a JSON RPC-valid notification: %s", string); } - error = stream_open_block(argv[1], &stream); + error = stream_open_block(stream_open(argv[1], &stream), &stream); if (error) { ovs_fatal(error, "could not open \"%s\"", argv[1]); } diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c index b2ab4c60..8cb6c943 100644 --- a/tests/test-ovsdb.c +++ b/tests/test-ovsdb.c @@ -1764,7 +1764,7 @@ do_idl(int argc, char *argv[]) if (argc > 2) { struct stream *stream; - error = stream_open_block(argv[1], &stream); + error = stream_open_block(stream_open(argv[1], &stream), &stream); if (error) { ovs_fatal(error, "failed to connect to \"%s\"", argv[1]); }