From: Shivam Garg Date: Thu, 29 Dec 2016 07:00:07 +0000 (+0900) Subject: Make logm to spit a message, before dropping messages if buffer overflows. X-Git-Tag: 1.1_Public_Release~679 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a80f26484608d27cc5ac9a7eda933cf3381b6637;p=rtos%2Ftinyara.git Make logm to spit a message, before dropping messages if buffer overflows. Change-Id: I6438fb53b11626a4f742c28cfd16ffe5d1832999 Signed-off-by: Shivam Garg --- diff --git a/os/logm/logm.c b/os/logm/logm.c index 72505c4..9cc3428 100644 --- a/os/logm/logm.c +++ b/os/logm/logm.c @@ -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 */ diff --git a/os/logm/logm.h b/os/logm/logm.h index 4bb5df1..db08d95 100644 --- a/os/logm/logm.h +++ b/os/logm/logm.h @@ -33,7 +33,14 @@ /**************************************************************************** * 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 */ diff --git a/os/logm/logm_process.c b/os/logm/logm_process.c index 83b1d1b..0228879 100644 --- a/os/logm/logm_process.c +++ b/os/logm/logm_process.c @@ -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--; }