aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/msgpack-gen.lua6
-rw-r--r--src/nvim/os/channel.c2
-rw-r--r--src/nvim/os/msgpack_rpc.c7
-rw-r--r--src/nvim/os/msgpack_rpc.h8
4 files changed, 16 insertions, 7 deletions
diff --git a/scripts/msgpack-gen.lua b/scripts/msgpack-gen.lua
index d303fde2fc..3cc1558fd7 100644
--- a/scripts/msgpack-gen.lua
+++ b/scripts/msgpack-gen.lua
@@ -111,7 +111,7 @@ end
output:write([[
};
-void msgpack_rpc_dispatch(msgpack_object *req, msgpack_packer *res)
+void msgpack_rpc_dispatch(uint64_t id, msgpack_object *req, msgpack_packer *res)
{
Error error = { .set = false };
uint64_t method_id = (uint32_t)req->via.array.ptr[2].via.u64;
@@ -119,7 +119,9 @@ void msgpack_rpc_dispatch(msgpack_object *req, msgpack_packer *res)
switch (method_id) {
case 0:
msgpack_pack_nil(res);
- // The result is the `msgpack_metadata` byte array
+ // The result is the [channel_id, metadata] array
+ msgpack_pack_array(res, 2);
+ msgpack_pack_uint64(res, id);
msgpack_pack_raw(res, sizeof(msgpack_metadata));
msgpack_pack_raw_body(res, msgpack_metadata, sizeof(msgpack_metadata));
return;
diff --git a/src/nvim/os/channel.c b/src/nvim/os/channel.c
index 8184003593..c103a71f46 100644
--- a/src/nvim/os/channel.c
+++ b/src/nvim/os/channel.c
@@ -157,7 +157,7 @@ static void parse_msgpack(RStream *rstream, void *data, bool eof)
channel->proto.msgpack.sbuffer,
msgpack_sbuffer_write);
// Perform the call
- msgpack_rpc_call(&unpacked.data, &response);
+ msgpack_rpc_call(channel->id, &unpacked.data, &response);
wstream_write(channel->data.streams.write,
xmemdup(channel->proto.msgpack.sbuffer->data,
channel->proto.msgpack.sbuffer->size),
diff --git a/src/nvim/os/msgpack_rpc.c b/src/nvim/os/msgpack_rpc.c
index 8ca1e0a8c0..62d68ebdec 100644
--- a/src/nvim/os/msgpack_rpc.c
+++ b/src/nvim/os/msgpack_rpc.c
@@ -1,3 +1,6 @@
+#include <stdint.h>
+#include <stdbool.h>
+
#include <msgpack.h>
#include "nvim/os/msgpack_rpc.h"
@@ -52,7 +55,7 @@
free(value.items); \
}
-void msgpack_rpc_call(msgpack_object *req, msgpack_packer *res)
+void msgpack_rpc_call(uint64_t id, msgpack_object *req, msgpack_packer *res)
{
// The initial response structure is the same no matter what happens,
// we set it up here
@@ -107,7 +110,7 @@ void msgpack_rpc_call(msgpack_object *req, msgpack_packer *res)
}
// dispatch the message
- msgpack_rpc_dispatch(req, res);
+ msgpack_rpc_dispatch(id, req, res);
}
void msgpack_rpc_error(char *msg, msgpack_packer *res)
diff --git a/src/nvim/os/msgpack_rpc.h b/src/nvim/os/msgpack_rpc.h
index aab284f2c8..bc216c0856 100644
--- a/src/nvim/os/msgpack_rpc.h
+++ b/src/nvim/os/msgpack_rpc.h
@@ -11,9 +11,10 @@
/// Validates the basic structure of the msgpack-rpc call and fills `res`
/// with the basic response structure.
///
+/// @param id The channel id
/// @param req The parsed request object
/// @param res A packer that contains the response
-void msgpack_rpc_call(msgpack_object *req, msgpack_packer *res);
+void msgpack_rpc_call(uint64_t id, msgpack_object *req, msgpack_packer *res);
/// Dispatches to the actual API function after basic payload validation by
/// `msgpack_rpc_call`. It is responsible for validating/converting arguments
@@ -21,9 +22,12 @@ void msgpack_rpc_call(msgpack_object *req, msgpack_packer *res);
/// The implementation is generated at compile time with metadata extracted
/// from the api/*.h headers,
///
+/// @param id The channel id
/// @param req The parsed request object
/// @param res A packer that contains the response
-void msgpack_rpc_dispatch(msgpack_object *req, msgpack_packer *res);
+void msgpack_rpc_dispatch(uint64_t id,
+ msgpack_object *req,
+ msgpack_packer *res);
/// Finishes the msgpack-rpc call with an error message.
///