diff mbox series

[ovs-dev,3/5] jsonrpc: Propagate return code from layer below.

Message ID 20250507134151.118615-4-martin.morgenstern@cloudandheat.com
State New
Delegated to: Ilya Maximets
Headers show
Series Timing API for jsonrpc, ovsdb-cs and ovsdb-idl. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed

Commit Message

Martin Morgenstern May 7, 2025, 1:41 p.m. UTC
Refactor jsonrpc_session_recv_until() to return the results of the
jsonrpc_recv()/jsonrpc_recv_until() calls, making it possible to detect
blocking calls (EAGAIN) in upper layers.

Signed-off-by: Martin Morgenstern <martin.morgenstern@cloudandheat.com>
---
 lib/jsonrpc.c | 22 +++++++++++++++-------
 lib/jsonrpc.h |  4 ++--
 2 files changed, 17 insertions(+), 9 deletions(-)
diff mbox series

Patch

diff --git a/lib/jsonrpc.c b/lib/jsonrpc.c
index c2bd72408..b02725a10 100644
--- a/lib/jsonrpc.c
+++ b/lib/jsonrpc.c
@@ -1269,18 +1269,21 @@  jsonrpc_session_send(struct jsonrpc_session *s, struct jsonrpc_msg *msg)
     }
 }
 
-struct jsonrpc_msg *
-jsonrpc_session_recv_until(struct jsonrpc_session *s, long long deadline)
+int
+jsonrpc_session_recv_until(struct jsonrpc_session *s,
+                           struct jsonrpc_msg **full_msg,
+                           long long deadline)
 {
     if (s->rpc) {
         unsigned int received_bytes;
         struct jsonrpc_msg *msg;
+        int ret;
 
         received_bytes = jsonrpc_get_received_bytes(s->rpc);
         if (deadline) {
-            jsonrpc_recv_until(s->rpc, &msg, deadline);
+            ret = jsonrpc_recv_until(s->rpc, &msg, deadline);
         } else {
-            jsonrpc_recv(s->rpc, &msg);
+            ret = jsonrpc_recv(s->rpc, &msg);
         }
 
         long long int now = time_msec();
@@ -1306,18 +1309,23 @@  jsonrpc_session_recv_until(struct jsonrpc_session *s, long long deadline)
                        && !strcmp(msg->id->string, "echo")) {
                 /* It's a reply to our echo request.  Suppress it. */
             } else {
-                return msg;
+                *full_msg = msg;
+                return 0;
             }
             jsonrpc_msg_destroy(msg);
+        } else {
+            return ret;
         }
     }
-    return NULL;
+    return 0;
 }
 
 struct jsonrpc_msg *
 jsonrpc_session_recv(struct jsonrpc_session *s)
 {
-    return jsonrpc_session_recv_until(s, 0);
+    struct jsonrpc_msg *msg = NULL;
+    jsonrpc_session_recv_until(s, &msg, 0);
+    return msg;
 }
 
 void
diff --git a/lib/jsonrpc.h b/lib/jsonrpc.h
index 09a4b0fd1..482d4d9a0 100644
--- a/lib/jsonrpc.h
+++ b/lib/jsonrpc.h
@@ -126,8 +126,8 @@  size_t jsonrpc_session_get_n_remotes(const struct jsonrpc_session *);
 
 int jsonrpc_session_send(struct jsonrpc_session *, struct jsonrpc_msg *);
 struct jsonrpc_msg *jsonrpc_session_recv(struct jsonrpc_session *);
-struct jsonrpc_msg *jsonrpc_session_recv_until(struct jsonrpc_session *,
-                                               long long);
+int jsonrpc_session_recv_until(struct jsonrpc_session *, struct jsonrpc_msg **,
+                               long long);
 void jsonrpc_session_recv_wait(struct jsonrpc_session *);
 
 bool jsonrpc_session_is_alive(const struct jsonrpc_session *);