Make logm to spit a message, before dropping messages if buffer overflows. 75/107675/6
authorShivam Garg <garg.shivam@samsung.com>
Thu, 29 Dec 2016 07:00:07 +0000 (16:00 +0900)
committerShivam Garg <garg.shivam@samsung.com>
Thu, 29 Dec 2016 12:06:29 +0000 (21:06 +0900)
Change-Id: I6438fb53b11626a4f742c28cfd16ffe5d1832999
Signed-off-by: Shivam Garg <garg.shivam@samsung.com>
os/logm/logm.c
os/logm/logm.h
os/logm/logm_process.c

index 72505c4..9cc3428 100644 (file)
@@ -27,7 +27,7 @@
 
 #include "logm.h"
 
-char g_logm_rsvbuf[LOGM_RSVBUF_COUNT][LOGM_MAX_MSG_LEN];
+char g_logm_rsvbuf[LOGM_RSVBUF_COUNT + 1][LOGM_MAX_MSG_LEN];
 int g_logm_head;
 int g_logm_tail;
 int g_logm_count;
@@ -37,22 +37,43 @@ int logm_internal(int priority, const char *fmt, va_list ap)
 {
        irqstate_t flags;
        int ret = 0;
-
-       /* Need logic for set here */
+       buffer_state_t op;
 
        if (g_logm_isready) {
                flags = irqsave();
 
-               /* choose a available buffer */
-               /* This section will be optimized later */
                if (g_logm_count < LOGM_RSVBUF_COUNT) {
+                       op = LESS;
+               }
+               else if (g_logm_count == LOGM_RSVBUF_COUNT) {
+                       op = EQUAL;
+               }
+               else {
+                       op = GREATER;
+               }
+
+               switch (op) {
+               case LESS:
                        ret = vsnprintf((char *)&g_logm_rsvbuf[g_logm_tail], LOGM_MAX_MSG_LEN - 1, fmt, ap);
-                       g_logm_tail += 1;
-                       if (g_logm_tail >= LOGM_RSVBUF_COUNT) {
-                               g_logm_tail -= LOGM_RSVBUF_COUNT;
-                       }
-                       g_logm_count++;
+                       break;
+               case EQUAL:
+                       ret = vsnprintf((char *)&g_logm_rsvbuf[g_logm_tail], LOGM_MAX_MSG_LEN - 1, "LOGM: Buffer Overflow dropping messages\n", ap);
+                       break;
+               case GREATER:
+                       irqrestore(flags);
+                       return 0;
                }
+               /* choose a available buffer */
+
+               if (ret > LOGM_MAX_MSG_LEN - 1) {
+                       g_logm_rsvbuf[g_logm_tail][LOGM_MAX_MSG_LEN - 1] = '\n';
+               }
+               g_logm_tail += 1;
+               if (g_logm_tail >= (LOGM_RSVBUF_COUNT + 1)) {
+                       g_logm_tail -= (LOGM_RSVBUF_COUNT + 1) ;
+               }
+               g_logm_count++;
+
                irqrestore(flags);
        } else {
                /* Low Output: Sytem is not yet completely ready  */
index 4bb5df1..db08d95 100644 (file)
 /****************************************************************************
  * Private Declarations
  ****************************************************************************/
-#define LOGM_PRIVATE_SIGNO (13)
+
+enum buffer_state_e {
+       LESS = 0,
+       EQUAL = 1,
+       GREATER = 2
+};
+
+typedef enum buffer_state_e buffer_state_t;
 
 /* Structure for a single debug message */
 
index 83b1d1b..0228879 100644 (file)
@@ -33,7 +33,6 @@ int logm_task(int argc, char *argv[])
        g_logm_head = 0;
        g_logm_tail = 0;
        g_logm_count = 0;
-
        /* Now logm is ready */
        g_logm_isready = 1;
 
@@ -45,8 +44,8 @@ int logm_task(int argc, char *argv[])
                while (g_logm_count > 0) {
                        fputs(g_logm_rsvbuf[g_logm_head], stdout);
                        g_logm_head += 1;
-                       if (g_logm_head >= LOGM_RSVBUF_COUNT) {
-                               g_logm_head -= LOGM_RSVBUF_COUNT;
+                       if (g_logm_head >= (LOGM_RSVBUF_COUNT + 1)) {
+                               g_logm_head -= (LOGM_RSVBUF_COUNT + 1);
                        }
                        g_logm_count--;
                }