X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fjsonrpc.c;h=5c7dfca9ef85e4cb34c60ca8b8a85eb06d15cb34;hb=76f105d9be03588c2d5ec0b94ff769a1d269f2e4;hp=0f535155ea62ff74039bb8a8b12f0e3c427c7567;hpb=4931f33ad9e25eb2df70ff20f1eeb4df813f8b2c;p=openvswitch diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c index 0f535155..5c7dfca9 100644 --- a/lib/jsonrpc.c +++ b/lib/jsonrpc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009 Nicira Networks. + * Copyright (c) 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ #include "jsonrpc.h" +#include #include #include "byteq.h" @@ -88,6 +89,7 @@ jsonrpc_run(struct jsonrpc *rpc) return; } + stream_run(rpc->stream); while (!queue_is_empty(&rpc->output)) { struct ofpbuf *buf = rpc->output.head; int retval; @@ -113,8 +115,11 @@ jsonrpc_run(struct jsonrpc *rpc) void jsonrpc_wait(struct jsonrpc *rpc) { - if (!rpc->status && !queue_is_empty(&rpc->output)) { - stream_send_wait(rpc->stream); + if (!rpc->status) { + stream_run_wait(rpc->stream); + if (!queue_is_empty(&rpc->output)) { + stream_send_wait(rpc->stream); + } } } @@ -147,19 +152,19 @@ jsonrpc_log_msg(const struct jsonrpc *rpc, const char *title, } if (msg->params) { ds_put_cstr(&s, ", params="); - ds_put_and_free_cstr(&s, json_to_string(msg->params, 0)); + json_to_ds(msg->params, 0, &s); } if (msg->result) { ds_put_cstr(&s, ", result="); - ds_put_and_free_cstr(&s, json_to_string(msg->result, 0)); + json_to_ds(msg->result, 0, &s); } if (msg->error) { ds_put_cstr(&s, ", error="); - ds_put_and_free_cstr(&s, json_to_string(msg->error, 0)); + json_to_ds(msg->error, 0, &s); } if (msg->id) { ds_put_cstr(&s, ", id="); - ds_put_and_free_cstr(&s, json_to_string(msg->id, 0)); + json_to_ds(msg->id, 0, &s); } VLOG_DBG("%s: %s %s%s", rpc->name, title, jsonrpc_msg_type_to_string(msg->type), ds_cstr(&s)); @@ -167,6 +172,7 @@ jsonrpc_log_msg(const struct jsonrpc *rpc, const char *title, } } +/* Always takes ownership of 'msg', regardless of success. */ int jsonrpc_send(struct jsonrpc *rpc, struct jsonrpc_msg *msg) { @@ -263,6 +269,7 @@ jsonrpc_recv_wait(struct jsonrpc *rpc) } } +/* Always takes ownership of 'msg', regardless of success. */ int jsonrpc_send_block(struct jsonrpc *rpc, struct jsonrpc_msg *msg) { @@ -273,12 +280,14 @@ jsonrpc_send_block(struct jsonrpc *rpc, struct jsonrpc_msg *msg) return error; } - while (!queue_is_empty(&rpc->output) && !rpc->status) { + for (;;) { jsonrpc_run(rpc); + if (queue_is_empty(&rpc->output) || rpc->status) { + return rpc->status; + } jsonrpc_wait(rpc); poll_block(); } - return rpc->status; } int @@ -297,6 +306,7 @@ jsonrpc_recv_block(struct jsonrpc *rpc, struct jsonrpc_msg **msgp) } } +/* Always takes ownership of 'request', regardless of success. */ int jsonrpc_transact_block(struct jsonrpc *rpc, struct jsonrpc_msg *request, struct jsonrpc_msg **replyp) @@ -681,7 +691,6 @@ jsonrpc_session_close(struct jsonrpc_session *s) static void jsonrpc_session_disconnect(struct jsonrpc_session *s) { - reconnect_disconnected(s->reconnect, time_msec(), 0); if (s->rpc) { jsonrpc_error(s->rpc, EOF); jsonrpc_close(s->rpc); @@ -718,10 +727,14 @@ jsonrpc_session_run(struct jsonrpc_session *s) jsonrpc_run(s->rpc); error = jsonrpc_get_status(s->rpc); if (error) { + reconnect_disconnected(s->reconnect, time_msec(), 0); jsonrpc_session_disconnect(s); } } else if (s->stream) { - int error = stream_connect(s->stream); + int error; + + stream_run(s->stream); + error = stream_connect(s->stream); if (!error) { reconnect_connected(s->reconnect, time_msec()); s->rpc = jsonrpc_open(s->stream); @@ -739,6 +752,7 @@ jsonrpc_session_run(struct jsonrpc_session *s) break; case RECONNECT_DISCONNECT: + reconnect_disconnected(s->reconnect, time_msec(), 0); jsonrpc_session_disconnect(s); break; @@ -763,6 +777,7 @@ jsonrpc_session_wait(struct jsonrpc_session *s) if (s->rpc) { jsonrpc_wait(s->rpc); } else if (s->stream) { + stream_run_wait(s->stream); stream_connect_wait(s->stream); } reconnect_wait(s->reconnect, time_msec()); @@ -780,10 +795,16 @@ jsonrpc_session_get_name(const struct jsonrpc_session *s) return reconnect_get_name(s->reconnect); } +/* Always takes ownership of 'msg', regardless of success. */ int jsonrpc_session_send(struct jsonrpc_session *s, struct jsonrpc_msg *msg) { - return s->rpc ? jsonrpc_send(s->rpc, msg) : ENOTCONN; + if (s->rpc) { + return jsonrpc_send(s->rpc, msg); + } else { + jsonrpc_msg_destroy(msg); + return ENOTCONN; + } } struct jsonrpc_msg *