From 185e6a4e1eb3e2cb90f3e103808b59218f33d32d Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Wed, 4 May 2016 11:18:09 +0200
Subject: [PATCH] warn when memory usage of local tracer grows too much

---
 common/utils/T/tracer/forward.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/common/utils/T/tracer/forward.c b/common/utils/T/tracer/forward.c
index 27b36c9a9b..15a23307b5 100644
--- a/common/utils/T/tracer/forward.c
+++ b/common/utils/T/tracer/forward.c
@@ -6,6 +6,8 @@
 #include <unistd.h>
 #include <pthread.h>
 #include <string.h>
+#include <stdint.h>
+#include <inttypes.h>
 
 typedef struct databuf {
   char *d;
@@ -20,6 +22,8 @@ typedef struct {
   pthread_mutex_t datalock;
   pthread_cond_t datacond;
   databuf * volatile head, *tail;
+  uint64_t memusage;
+  uint64_t last_warning_memusage;
 } forward_data;
 
 static void *data_sender(void *_f)
@@ -37,6 +41,7 @@ wait:
   buf = cur->d;
   size = cur->l;
   f->head = cur->next;
+  f->memusage -= size;
   if (f->head == NULL) f->tail = NULL;
   if (pthread_mutex_unlock(&f->datalock)) abort();
   free(cur);
@@ -122,6 +127,9 @@ void *forwarder(char *ip, int port)
   f->sc = -1;
   f->head = f->tail = NULL;
 
+  f->memusage = 0;
+  f->last_warning_memusage = 0;
+
   printf("connecting to remote tracer %s:%d\n", ip, port);
 
 again:
@@ -167,6 +175,19 @@ void forward(void *_forwarder, char *buf, int size)
   if (f->tail != NULL) f->tail->next = new;
   f->tail = new;
 
+  f->memusage += size+4;
+  /* warn every 100MB */
+  if (f->memusage > f->last_warning_memusage &&
+      f->memusage - f->last_warning_memusage > 100000000) {
+    f->last_warning_memusage += 100000000;
+    printf("WARNING: memory usage is over %"PRIu64"MB\n",
+           f->last_warning_memusage / 1000000);
+  } else
+  if (f->memusage < f->last_warning_memusage &&
+      f->last_warning_memusage - f->memusage > 100000000) {
+    f->last_warning_memusage = (f->memusage/100000000) * 100000000;
+  }
+
   if (pthread_cond_signal(&f->datacond)) abort();
   if (pthread_mutex_unlock(&f->datalock)) abort();
 }
-- 
GitLab