aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2013-04-05 11:30:23 +0200
committerGerd Hoffmann <kraxel@redhat.com>2013-04-16 11:52:09 +0200
commitb010cec86b9a4a0b63162cd27e37c2d99e90ed66 (patch)
tree107d19633a0368fc7ce1f10d48a4ec2ec4d7ad4b
parentae893e5e818878caf433d716d37be9df297403fe (diff)
spice-qemu-char: Remove intermediate buffer
virtio-serial's buffer is valid when it calls us, and we don't access it otherwise: vmc_read is only called in response to wakeup, or else we set datalen=0 and throttle. Then vmc_read is called back, we return 0 (not accessing the buffer) and set the timer to unthrottle. Also make datalen int and not ssize_t (to fit spice_chr_write signature). HdG: Update to apply to spice-qemu-char with new gio-channel based flowcontrol support. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--spice-qemu-char.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/spice-qemu-char.c b/spice-qemu-char.c
index 7e551bf46e..ff95fcbe01 100644
--- a/spice-qemu-char.c
+++ b/spice-qemu-char.c
@@ -14,9 +14,8 @@ typedef struct SpiceCharDriver {
char *subtype;
bool active;
bool blocked;
- uint8_t *buffer;
- uint8_t *datapos;
- ssize_t bufsize, datalen;
+ const uint8_t *datapos;
+ int datalen;
QLIST_ENTRY(SpiceCharDriver) next;
} SpiceCharDriver;
@@ -186,12 +185,7 @@ static int spice_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
int read_bytes;
assert(s->datalen == 0);
- if (s->bufsize < len) {
- s->bufsize = len;
- s->buffer = g_realloc(s->buffer, s->bufsize);
- }
- memcpy(s->buffer, buf, len);
- s->datapos = s->buffer;
+ s->datapos = buf;
s->datalen = len;
spice_server_char_device_wakeup(&s->sin);
read_bytes = len - s->datalen;