[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 2/4] vnc: allow the Buffer to shrink again
From: |
Peter Lieven |
Subject: |
[Qemu-devel] [PATCH 2/4] vnc: allow the Buffer to shrink again |
Date: |
Thu, 27 Aug 2015 12:18:52 +0200 |
currently the Buffer can only grow. This increases Qemu memory footprint
dramatically since normally the biggest VNC updates are at connection time.
But also after a VNC session has terminated there is one persistent buffer
in queue->buffer which I have seen to increase to over 100MB and it is never
getting smaller again.
Signed-off-by: Peter Lieven <address@hidden>
---
ui/vnc.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/ui/vnc.c b/ui/vnc.c
index 8cfd2d8..061e337 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -654,6 +654,7 @@ void vnc_framebuffer_update(VncState *vs, int x, int y, int
w, int h,
}
#define BUFFER_MIN_INIT_SIZE 4096
+#define BUFFER_MIN_SHRINK_SIZE 65536
void buffer_reserve(Buffer *buffer, size_t len)
{
@@ -674,9 +675,19 @@ uint8_t *buffer_end(Buffer *buffer)
return buffer->buffer + buffer->offset;
}
+static void buffer_shrink(Buffer *buffer) {
+ size_t new = MAX(pow2ceil(buffer->offset) * 2,
+ BUFFER_MIN_SHRINK_SIZE);
+ if (new < buffer->capacity) {
+ buffer->buffer = g_realloc(buffer->buffer, new);
+ buffer->capacity = new;
+ }
+}
+
void buffer_reset(Buffer *buffer)
{
- buffer->offset = 0;
+ buffer->offset = 0;
+ buffer_shrink(buffer);
}
void buffer_free(Buffer *buffer)
@@ -698,6 +709,7 @@ void buffer_advance(Buffer *buf, size_t len)
memmove(buf->buffer, buf->buffer + len,
(buf->offset - len));
buf->offset -= len;
+ buffer_shrink(buf);
}
static void vnc_desktop_resize(VncState *vs)
--
1.9.1