From a8f0d21330b40993d52421327b1aa33a6ea7acb7 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Thu, 2 Jun 2011 20:27:16 +0200 Subject: [PATCH] More stable sorting in tincctl top. Although we use qsort(), which is not guaranteed to be stable, resorting the previously sorted array is more stable than recreating and resorting the array each time. --- src/top.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/top.c b/src/top.c index f4e73038..4203e255 100644 --- a/src/top.c +++ b/src/top.c @@ -57,6 +57,7 @@ static list_t node_list; static struct timeval now, prev, diff; static int delay = 1000; static bool running = true; +static bool changed = true; static void update(int fd) { sendline(fd, "%d %d", CONTROL, REQ_DUMP_TRAFFIC); @@ -136,10 +137,15 @@ static void redraw(void) { mvprintw(2, 0, "Node IN pkts IN bytes OUT pkts OUT bytes"); chgat(-1, A_REVERSE, 0, NULL); - nodestats_t *sorted[node_list.count]; - int n = 0; - for(list_node_t *i = node_list.head; i; i = i->next) - sorted[n++] = i->data; + static nodestats_t **sorted = 0; + static int n = 0; + if(changed) { + n = 0; + sorted = xrealloc(sorted, node_list.count * sizeof *sorted); + for(list_node_t *i = node_list.head; i; i = i->next) + sorted[n++] = i->data; + changed = false; + } int cmpfloat(float a, float b) { if(a < b) @@ -200,8 +206,7 @@ static void redraw(void) { qsort(sorted, n, sizeof *sorted, sortfunc); - int row = 3; - for(int i = 0; i < n; i++, row++) { + for(int i = 0, row = 3; i < n; i++, row++) { nodestats_t *node = sorted[i]; if(node->known) if(node->in_packets_rate || node->out_packets_rate) -- 2.20.1