aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-06-04 10:36:53 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-06-04 10:36:53 +0100
commit46245b38853b4bd6425be0c2de118433b73b5fa4 (patch)
tree81f8545ff7233b53b0ac2ed1593b7da00566bdd3
parent22d682f05da7b8714a2808d1c0bf4b3883b05fc6 (diff)
downloadxen-46245b38853b4bd6425be0c2de118433b73b5fa4.tar.gz
xen-46245b38853b4bd6425be0c2de118433b73b5fa4.tar.bz2
xen-46245b38853b4bd6425be0c2de118433b73b5fa4.zip
xenconsoled: Discard guest console data in bigger chunks
Discard guest console data in bigger chunks so that there are fewer discontinuities in the console data. Also avoid discarding data if space is available at the front of the buffer by reclaiming that space. Patch from: Christian Limpach <Christian.Limpach@citrix.com> Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com> xen-unstable changeset: 21464:83a3f9556a05 xen-unstable date: Thu May 27 08:21:24 2010 +0100
-rw-r--r--tools/console/daemon/io.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c
index 5a6ccbfd43..22833d7469 100644
--- a/tools/console/daemon/io.c
+++ b/tools/console/daemon/io.c
@@ -202,18 +202,25 @@ static void buffer_append(struct domain *dom)
}
if (discard_overflowed_data && buffer->max_capacity &&
- buffer->size > buffer->max_capacity) {
- /* Discard the middle of the data. */
-
- size_t over = buffer->size - buffer->max_capacity;
- char *maxpos = buffer->data + buffer->max_capacity;
-
- memmove(maxpos - over, maxpos, over);
- buffer->data = realloc(buffer->data, buffer->max_capacity);
- buffer->size = buffer->capacity = buffer->max_capacity;
+ buffer->size > 5 * buffer->max_capacity / 4) {
+ if (buffer->consumed > buffer->max_capacity / 4) {
+ /* Move data up in buffer, since beginning has
+ * been output. Only needed because buffer is
+ * not a ring buffer *sigh* */
+ memmove(buffer->data,
+ buffer->data + buffer->consumed,
+ buffer->size - buffer->consumed);
+ buffer->size -= buffer->consumed;
+ buffer->consumed = 0;
+ } else {
+ /* Discard the middle of the data. */
+ size_t over = buffer->size - buffer->max_capacity;
- if (buffer->consumed > buffer->max_capacity - over)
- buffer->consumed = buffer->max_capacity - over;
+ memmove(buffer->data + buffer->max_capacity / 2,
+ buffer->data + buffer->max_capacity,
+ over);
+ buffer->size = buffer->max_capacity / 2 + over;
+ }
}
}