summaryrefslogtreecommitdiffstats
path: root/server/reds.c
diff options
context:
space:
mode:
authorYonit Halperin <yhalperi@redhat.com>2012-06-24 14:16:59 +0300
committerYonit Halperin <yhalperi@redhat.com>2012-07-03 14:13:41 +0300
commite88f03f16b34505ba2b8510c0670775928f5c0eb (patch)
tree7e9b725773c33edb79e8e0edf87a9f5fe6d84086 /server/reds.c
parentbf1d9007b40d233369a3e202895837c60fe2f87b (diff)
downloadspice-e88f03f16b34505ba2b8510c0670775928f5c0eb.tar.gz
spice-e88f03f16b34505ba2b8510c0670775928f5c0eb.tar.xz
spice-e88f03f16b34505ba2b8510c0670775928f5c0eb.zip
agent: use SpiceCharDeviceWriteBuffer for agent data from the client
This is an intermediate patch. The next patch will actually push the buffer to the device, instead of copying it.
Diffstat (limited to 'server/reds.c')
-rw-r--r--server/reds.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/server/reds.c b/server/reds.c
index 17b8f7e7..8abf19e4 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -172,6 +172,8 @@ typedef struct VDIPortState {
Ring external_bufs;
Ring internal_bufs;
Ring write_queue;
+ SpiceCharDeviceWriteBuffer *recv_from_client_buf;
+ int recv_from_client_buf_pushed;
AgentMsgFilter write_filter;
/* read from agent */
@@ -1179,6 +1181,38 @@ void reds_on_main_agent_tokens(MainChannelClient *mcc, uint32_t num_tokens)
num_tokens);
}
+uint8_t *reds_get_agent_data_buffer(MainChannelClient *mcc, size_t size)
+{
+ VDIPortState *dev_state = &reds->agent_state;
+ RedClient *client;
+
+ if (!dev_state->base) {
+ return NULL;
+ }
+
+ spice_assert(dev_state->recv_from_client_buf == NULL);
+ client = main_channel_client_get_base(mcc)->client;
+ dev_state->recv_from_client_buf = spice_char_device_write_buffer_get(dev_state->base,
+ client,
+ size + sizeof(VDIChunkHeader));
+ dev_state->recv_from_client_buf_pushed = FALSE;
+ return dev_state->recv_from_client_buf->buf + sizeof(VDIChunkHeader);
+}
+
+void reds_release_agent_data_buffer(uint8_t *buf)
+{
+ VDIPortState *dev_state = &reds->agent_state;
+
+ spice_assert(buf == dev_state->recv_from_client_buf->buf + sizeof(VDIChunkHeader));
+
+ if (!dev_state->recv_from_client_buf_pushed) {
+ spice_char_device_write_buffer_release(reds->agent_state.base,
+ dev_state->recv_from_client_buf);
+ }
+ dev_state->recv_from_client_buf = NULL;
+ dev_state->recv_from_client_buf_pushed = FALSE;
+}
+
void reds_on_main_agent_data(MainChannelClient *mcc, void *message, size_t size)
{
// TODO - use mcc (and start tracking agent data per channel. probably just move the whole