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