]> xenbits.xensource.com Git - xen.git/commitdiff
xenconsoled: Discard guest console data in bigger chunks
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 27 May 2010 07:21:24 +0000 (08:21 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 27 May 2010 07:21:24 +0000 (08:21 +0100)
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>
tools/console/daemon/io.c

index 5a6ccbfd4397bd1843ac7c1211cd74981a93d31e..22833d746998ec71bd8caff84fffc79fed0c0c5b 100644 (file)
@@ -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;
+               }
        }
 }