From afcdb1e6a9921b99b57bc6c716f8a40eeb378bc5 Mon Sep 17 00:00:00 2001
From: Haruki NAOI <naoi.haruki@jp.fujitsu.com>
Date: Thu, 12 Apr 2018 10:53:44 +0900
Subject: [PATCH] enb-log-mem_sp2.patch into closed_item

(cherry picked from commit 3432385280c3155ee63a54be7c2e4846a17299de)

# Conflicts:
#	openair2/UTIL/LOG/log.c
---
 common/utils/itti/assertions.h  |   2 +
 common/utils/itti/signals.c     |   3 +
 openair2/UTIL/LOG/log.c         | 165 +++++++++++++++++++++++++++++++-
 openair2/UTIL/LOG/log.h         |   4 +
 openair2/UTIL/LOG/log_extern.h  |   3 +
 targets/RT/USER/lte-softmodem.c |   9 +-
 targets/RT/USER/lte-softmodem.h |   1 +
 7 files changed, 184 insertions(+), 3 deletions(-)

diff --git a/common/utils/itti/assertions.h b/common/utils/itti/assertions.h
index bb6c27cbab..803c3d001e 100644
--- a/common/utils/itti/assertions.h
+++ b/common/utils/itti/assertions.h
@@ -35,9 +35,11 @@
 #ifndef ASSERTIONS_H_
 #define ASSERTIONS_H_
 
+void output_log_mem(void);
 #define _Assert_Exit_                           \
 {                                               \
     fprintf(stderr, "\nExiting execution\n");   \
+    output_log_mem();                           \
     display_backtrace();                        \
     fflush(stdout);                             \
     fflush(stderr);                             \
diff --git a/common/utils/itti/signals.c b/common/utils/itti/signals.c
index 9767ba3f67..4804e6b731 100644
--- a/common/utils/itti/signals.c
+++ b/common/utils/itti/signals.c
@@ -117,16 +117,19 @@ int signal_handle(int *end)
     case SIGUSR1:
       SIG_DEBUG("Received SIGUSR1\n");
       *end = 1;
+      output_log_mem();
       break;
 
     case SIGSEGV:   /* Fall through */
     case SIGABRT:
       SIG_DEBUG("Received SIGABORT\n");
+      output_log_mem();
       backtrace_handle_signal(&info);
       break;
 
     case SIGINT:
       printf("Received SIGINT\n");
+      output_log_mem();
       itti_send_terminate_message(TASK_UNKNOWN);
       *end = 1;
       break;
diff --git a/openair2/UTIL/LOG/log.c b/openair2/UTIL/LOG/log.c
index 948425e8da..579cd675c1 100644
--- a/openair2/UTIL/LOG/log.c
+++ b/openair2/UTIL/LOG/log.c
@@ -48,6 +48,26 @@
 // main log variables
 log_t *g_log;
 
+typedef struct {
+	char* buf_p;
+	int buf_index;
+  int enable_flag;
+} log_mem_cnt_t;
+
+log_mem_cnt_t log_mem_d[2];
+int log_mem_flag=0;
+int log_mem_multi=1;
+volatile int log_mem_side=0;
+pthread_mutex_t log_mem_lock;
+pthread_cond_t log_mem_notify;
+pthread_t log_mem_thread;
+int log_mem_file_cnt=0;
+volatile int log_mem_write_flag=0;
+volatile int log_mem_write_side=0;
+
+char __log_mem_filename[1024]={0};
+char * log_mem_filename = &__log_mem_filename[0];
+
 mapping log_level_names[] = {
   {"emerg", LOG_EMERG},
   {"alert", LOG_ALERT},
@@ -494,6 +514,81 @@ int logInit (void)
   return 0;
 }
 
+extern int oai_exit;
+void * log_mem_write(void)
+{
+  int *fp;
+  char f_name[1024];
+  struct timespec slp_tm;
+  slp_tm.tv_sec = 0;
+  slp_tm.tv_nsec = 10000;
+  
+  pthread_setname_np( pthread_self(), "log_mem_write");
+
+  while (!oai_exit) {
+    pthread_mutex_lock(&log_mem_lock);
+    log_mem_write_flag=0;
+    pthread_cond_wait(&log_mem_notify, &log_mem_lock);
+    log_mem_write_flag=1;
+    pthread_mutex_unlock(&log_mem_lock);
+    // write!
+    if(log_mem_d[log_mem_write_side].enable_flag==0){
+      if(log_mem_file_cnt>1){
+        log_mem_file_cnt=1;
+        printf("log over write!!!\n");
+      }
+      snprintf(f_name,1024, "%s_%d.log",log_mem_filename,log_mem_file_cnt);
+      fp=open(f_name, O_WRONLY | O_CREAT, 0666);
+      write(fp, log_mem_d[log_mem_write_side].buf_p, log_mem_d[log_mem_write_side].buf_index);
+      close(fp);
+      log_mem_file_cnt++;
+      log_mem_d[log_mem_write_side].buf_index=0;
+      log_mem_d[log_mem_write_side].enable_flag=1;
+    }else{
+      printf("If you'd like to write log, you should set enable flag to 0!!!\n");
+      nanosleep(&slp_tm,NULL);
+    }
+  }
+}
+
+int logInit_log_mem (void)
+{
+  if(log_mem_flag==1){
+    if(log_mem_multi==1){
+      printf("log-mem multi!!!\n");
+      log_mem_d[0].buf_p = malloc(LOG_MEM_SIZE);
+      log_mem_d[0].buf_index=0;
+      log_mem_d[0].enable_flag=1;
+      log_mem_d[1].buf_p = malloc(LOG_MEM_SIZE);
+      log_mem_d[1].buf_index=0;
+      log_mem_d[1].enable_flag=1;
+      log_mem_side=0;
+      if ((pthread_mutex_init (&log_mem_lock, NULL) != 0)
+          || (pthread_cond_init (&log_mem_notify, NULL) != 0)) {
+        log_mem_d[1].enable_flag=0;
+        return;
+      }
+      pthread_create(&log_mem_thread, NULL, log_mem_write, (void*)NULL);
+    }else{
+      printf("log-mem single!!!\n");
+      log_mem_d[0].buf_p = malloc(LOG_MEM_SIZE);
+      log_mem_d[0].buf_index=0;
+      log_mem_d[0].enable_flag=1;
+      log_mem_d[1].enable_flag=0;
+      log_mem_side=0;
+    }
+  }else{
+    log_mem_d[0].buf_p=NULL;
+    log_mem_d[1].buf_p=NULL;
+    log_mem_d[0].enable_flag=0;
+    log_mem_d[1].enable_flag=0;
+  }
+
+  printf("log init done\n");
+  
+  return 0;
+}
+
 void nfapi_log(char *file, char *func, int line, int comp, int level, const char* format, va_list args)
 {
   //logRecord_mt(file,func,line, pthread_self(), comp, level, format, ##args)
@@ -1295,6 +1390,7 @@ void logRecord_mt(const char *file, const char *func, int line, int comp,
    * big enough so that the buffer is never full.
    */
   char log_buffer[MAX_LOG_TOTAL];
+  int temp_index;
 
   /* for no gcc warnings */
   (void)log_start;
@@ -1392,7 +1488,41 @@ void logRecord_mt(const char *file, const char *func, int line, int comp,
 
   // OAI printf compatibility
   if ((g_log->onlinelog == 1) && (level != LOG_FILE))
+  if(log_mem_flag==1){
+    if(log_mem_d[log_mem_side].enable_flag==1){
+      temp_index=log_mem_d[log_mem_side].buf_index;
+      if(temp_index+len+1 < LOG_MEM_SIZE){
+        log_mem_d[log_mem_side].buf_index+=len;
+        memcpy(&log_mem_d[log_mem_side].buf_p[temp_index],log_buffer,len);
+      }else{
+        log_mem_d[log_mem_side].enable_flag=0;
+        if(log_mem_d[1-log_mem_side].enable_flag==1){
+          temp_index=log_mem_d[1-log_mem_side].buf_index;
+          if(temp_index+len+1 < LOG_MEM_SIZE){
+            log_mem_d[1-log_mem_side].buf_index+=len;
+            log_mem_side=1-log_mem_side;
+            memcpy(&log_mem_d[log_mem_side].buf_p[temp_index],log_buffer,len);
+            /* write down !*/
+            if (pthread_mutex_lock(&log_mem_lock) != 0) {
+              return;
+            }
+            if(log_mem_write_flag==0){
+              log_mem_write_side=1-log_mem_side;
+              if(pthread_cond_signal(&log_mem_notify) != 0) {
+              }
+            }
+            if(pthread_mutex_unlock(&log_mem_lock) != 0) {
+              return;
+            }
+          }else{
+            log_mem_d[1-log_mem_side].enable_flag=0;
+          }
+        }
+      }
+    }
+  }else{
     fwrite(log_buffer, len, 1, stdout);
+  }
 
   if (g_log->syslog) {
     syslog(g_log->level, "%s", log_buffer);
@@ -1719,7 +1849,40 @@ void log_set_instance_type (log_instance_type_t instance)
   log_instance_type = instance;
 }
 #endif
-
+  
+void output_log_mem(void){
+  int cnt,cnt2;
+  int *fp;
+  char f_name[1024];
+
+  if(log_mem_flag==1){
+    log_mem_d[0].enable_flag=0;
+    log_mem_d[1].enable_flag=0;
+    usleep(10); // wait for log writing
+    while(log_mem_write_flag==1){
+      usleep(100);
+    }
+    if(log_mem_multi==1){
+      snprintf(f_name,1024, "%s_%d.log",log_mem_filename,log_mem_file_cnt);
+      fp=open(f_name, O_WRONLY | O_CREAT, 0666);
+      write(fp, log_mem_d[0].buf_p, log_mem_d[0].buf_index);
+      close(fp);
+      free(log_mem_d[0].buf_p);
+      
+      snprintf(f_name,1024, "%s_%d.log",log_mem_filename,log_mem_file_cnt);
+      fp=open(f_name, O_WRONLY | O_CREAT, 0666);
+      write(fp, log_mem_d[1].buf_p, log_mem_d[1].buf_index);
+      close(fp);
+      free(log_mem_d[1].buf_p);
+    }else{
+      fp=open(log_mem_filename, O_WRONLY | O_CREAT, 0666);
+      write(fp, log_mem_d[0].buf_p, log_mem_d[0].buf_index);
+      close(fp);
+      free(log_mem_d[0].buf_p);
+    }
+  }
+}
+  
 #ifdef LOG_TEST
 
 int main(int argc, char *argv[])
diff --git a/openair2/UTIL/LOG/log.h b/openair2/UTIL/LOG/log.h
index c21407f6eb..120262c621 100644
--- a/openair2/UTIL/LOG/log.h
+++ b/openair2/UTIL/LOG/log.h
@@ -253,6 +253,10 @@ typedef enum log_instance_type_e {
 void log_set_instance_type (log_instance_type_t instance);
 #endif
 
+#define LOG_MEM_SIZE 100*1024*1024
+#define LOG_MEM_FILE "./logmem.log"
+int logInit_log_mem(void);
+void output_log_mem(void);
 
 /*--- INCLUDES ---------------------------------------------------------------*/
 #    include "log_if.h"
diff --git a/openair2/UTIL/LOG/log_extern.h b/openair2/UTIL/LOG/log_extern.h
index 611487ffea..0e7c49cc8d 100644
--- a/openair2/UTIL/LOG/log_extern.h
+++ b/openair2/UTIL/LOG/log_extern.h
@@ -32,3 +32,6 @@ extern int log_shutdown;
 
 extern mapping log_level_names[];
 extern mapping log_verbosity_names[];
+
+extern int log_mem_flag;
+extern char * log_mem_filename;
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 8bc3c65b88..cabebd2c52 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -144,8 +144,7 @@ static char                     threequarter_fs=0;
 uint32_t                 downlink_frequency[MAX_NUM_CCs][4];
 int32_t                  uplink_frequency_offset[MAX_NUM_CCs][4];
 
-
-
+char logmem_filename[1024] = {0};
 #if defined(ENABLE_ITTI)
 static char                    *itti_dump_file = NULL;
 #endif
@@ -605,6 +604,12 @@ static void get_options(void) {
   if (start_telnetsrv) {
      load_module_shlib("telnetsrv",NULL,0);
   }
+  if (strlen(logmem_filename) > 0) {
+    log_mem_filename = &logmem_filename[0];
+    log_mem_flag = 1;
+    printf("Enabling OPT for log save at memory %s\n",log_mem_filename);
+    logInit_log_mem();
+  }
 
   
   if (UE_flag > 0) {
diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h
index 0e5e6b6081..3b2bd5bf2c 100644
--- a/targets/RT/USER/lte-softmodem.h
+++ b/targets/RT/USER/lte-softmodem.h
@@ -182,6 +182,7 @@ extern int16_t dlsch_demod_shift;
 {"g" ,  		  	 CONFIG_HLP_LOGL,	0,		  uptr:&glog_level,			defintval:0,			   TYPE_UINT,     0},			   \
 {"G" ,                           CONFIG_HLP_LOGV,	0,		  uptr:&glog_verbosity,		        defintval:0,			   TYPE_UINT16,   0},			   \
 {"telnetsrv",    		 CONFIG_HLP_TELN,	PARAMFLAG_BOOL,	  uptr:&start_telnetsrv,		defintval:0,			   TYPE_UINT,     0},			   \
+{"log-mem",                       NULL,                  0,                strptr:(char **)&logmem_filename,    defstrval:"./logmem.log",          TYPE_STRING,   sizeof(logmem_filename)},    \
 }
 #define CMDLINE_ONLINELOG_IDX     0 
 #define CMDLINE_GLOGLEVEL_IDX     1
-- 
GitLab