Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zzha zzha
OpenXG-RAN
Commits
4cd5d80d
Commit
4cd5d80d
authored
Jun 08, 2019
by
wujing
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add log-mem function to collect log
parent
d5d1c195
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
309 additions
and
3 deletions
+309
-3
common/utils/LOG/log.c
common/utils/LOG/log.c
+280
-1
common/utils/LOG/log.h
common/utils/LOG/log.h
+15
-0
common/utils/LOG/log_extern.h
common/utils/LOG/log_extern.h
+3
-1
targets/RT/USER/lte-softmodem-common.c
targets/RT/USER/lte-softmodem-common.c
+8
-0
targets/RT/USER/lte-softmodem.c
targets/RT/USER/lte-softmodem.c
+1
-1
targets/RT/USER/lte-softmodem.h
targets/RT/USER/lte-softmodem.h
+2
-0
No files found.
common/utils/LOG/log.c
View file @
4cd5d80d
...
...
@@ -45,7 +45,19 @@
#include "common/config/config_userapi.h"
// main log variables
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
];
char
logmem_filename
[
1024
]
=
{
0
};
mapping
log_level_names
[]
=
{
...
...
@@ -456,15 +468,23 @@ void logRecord_mt(const char *file, const char *func, int line, int comp, int le
char
log_buffer
[
MAX_LOG_TOTAL
];
va_list
args
;
va_start
(
args
,
format
);
if
(
log_mem_flag
==
1
)
{
log_output_memory
(
file
,
func
,
line
,
comp
,
level
,
format
,
args
);
}
else
{
log_header
(
log_buffer
,
MAX_LOG_TOTAL
,
comp
,
level
,
format
);
g_log
->
log_component
[
comp
].
vprint
(
g_log
->
log_component
[
comp
].
stream
,
log_buffer
,
args
);
}
va_end
(
args
);
}
void
vlogRecord_mt
(
const
char
*
file
,
const
char
*
func
,
int
line
,
int
comp
,
int
level
,
const
char
*
format
,
va_list
args
)
{
char
log_buffer
[
MAX_LOG_TOTAL
];
if
(
log_mem_flag
==
1
)
{
log_output_memory
(
file
,
func
,
line
,
comp
,
level
,
format
,
args
);
}
else
{
log_header
(
log_buffer
,
MAX_LOG_TOTAL
,
comp
,
level
,
format
);
g_log
->
log_component
[
comp
].
vprint
(
g_log
->
log_component
[
comp
].
stream
,
log_buffer
,
args
);
}
}
void
log_dump
(
int
component
,
void
*
buffer
,
int
buffsize
,
int
datatype
,
const
char
*
format
,
...
)
{
...
...
@@ -646,6 +666,265 @@ void logClean (void) {
}
}
extern
int
oai_exit
;
void
flush_mem_to_file
(
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
(),
"flush_mem_to_file"
);
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
>
5
){
log_mem_file_cnt
=
5
;
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
);
int
ret
=
write
(
fp
,
log_mem_d
[
log_mem_write_side
].
buf_p
,
log_mem_d
[
log_mem_write_side
].
buf_index
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"{LOG} %s %d Couldn't write in %s
\n
"
,
__FILE__
,
__LINE__
,
f_name
);
exit
(
EXIT_FAILURE
);
}
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
);
}
}
}
char
logmem_log_level
[
NUM_LOG_LEVEL
]
=
{
'E'
,
'W'
,
'I'
,
'D'
,
'T'
};
void
log_output_memory
(
const
char
*
file
,
const
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)
int
len
=
0
;
log_component_t
*
c
;
char
*
log_start
;
char
*
log_end
;
/* The main difference with the version above is the use of this local log_buffer.
* The other difference is the return value of snprintf which was not used
* correctly. It was not a big problem because in practice MAX_LOG_TOTAL is
* big enough so that the buffer is never full.
*/
char
log_buffer
[
MAX_LOG_TOTAL
];
/* for no gcc warnings */
(
void
)
log_start
;
(
void
)
log_end
;
c
=
&
g_log
->
log_component
[
comp
];
//VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LOG_RECORD, VCD_FUNCTION_IN);
// make sure that for log trace the extra info is only printed once, reset when the level changes
if
(
level
==
OAILOG_TRACE
)
{
log_start
=
log_buffer
;
len
=
vsnprintf
(
log_buffer
,
MAX_LOG_TOTAL
,
format
,
args
);
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
log_end
=
log_buffer
+
len
;
}
else
{
if
(
(
g_log
->
flag
&
0x001
)
||
(
c
->
flag
&
0x001
)
)
{
len
+=
snprintf
(
&
log_buffer
[
len
],
MAX_LOG_TOTAL
-
len
,
"%s"
,
log_level_highlight_start
[
level
]);
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
}
log_start
=
log_buffer
+
len
;
// if ( (g_log->flag & 0x004) || (c->flag & 0x004) ) {
len
+=
snprintf
(
&
log_buffer
[
len
],
MAX_LOG_TOTAL
-
len
,
"[%s]"
,
g_log
->
log_component
[
comp
].
name
);
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
// }
if
(
(
level
>=
OAILOG_ERR
)
&&
(
level
<=
OAILOG_TRACE
)
)
{
len
+=
snprintf
(
&
log_buffer
[
len
],
MAX_LOG_TOTAL
-
len
,
"[%c]"
,
logmem_log_level
[
level
]);
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
}
if
(
(
g_log
->
flag
&
FLAG_THREAD
)
||
(
c
->
flag
&
FLAG_THREAD
)
)
{
# define THREAD_NAME_LEN 128
char
threadname
[
THREAD_NAME_LEN
];
if
(
pthread_getname_np
(
pthread_self
(),
threadname
,
THREAD_NAME_LEN
)
!=
0
)
{
perror
(
"pthread_getname_np : "
);
}
else
{
len
+=
snprintf
(
&
log_buffer
[
len
],
MAX_LOG_TOTAL
-
len
,
"[%s]"
,
threadname
);
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
}
# undef THREAD_NAME_LEN
}
if
(
(
g_log
->
flag
&
FLAG_FUNCT
)
||
(
c
->
flag
&
FLAG_FUNCT
)
)
{
len
+=
snprintf
(
&
log_buffer
[
len
],
MAX_LOG_TOTAL
-
len
,
"[%s] "
,
func
);
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
}
if
(
(
g_log
->
flag
&
FLAG_FILE_LINE
)
||
(
c
->
flag
&
FLAG_FILE_LINE
)
)
{
len
+=
snprintf
(
&
log_buffer
[
len
],
MAX_LOG_TOTAL
-
len
,
"[%s:%d]"
,
file
,
line
);
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
}
/* len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%08lx]", thread_id);
if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
struct timeval gettime;
gettimeofday(&gettime,NULL);
len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%ld.%06ld]", gettime.tv_sec, gettime.tv_usec);
if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
*/
if
(
(
g_log
->
flag
&
FLAG_NOCOLOR
)
||
(
c
->
flag
&
FLAG_NOCOLOR
)
)
{
len
+=
snprintf
(
&
log_buffer
[
len
],
MAX_LOG_TOTAL
-
len
,
"%s"
,
log_level_highlight_end
[
level
]);
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
}
len
+=
vsnprintf
(
&
log_buffer
[
len
],
MAX_LOG_TOTAL
-
len
,
format
,
args
);
if
(
len
>
MAX_LOG_TOTAL
)
len
=
MAX_LOG_TOTAL
;
log_end
=
log_buffer
+
len
;
}
//va_end(args);
// OAI printf compatibility
if
(
log_mem_flag
==
1
){
if
(
log_mem_d
[
log_mem_side
].
enable_flag
==
1
){
int
temp_index
;
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
);
}
}
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
-
1
;
}
pthread_create
(
&
log_mem_thread
,
NULL
,
(
void
*
(
*
)(
void
*
))
flush_mem_to_file
,
(
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
close_log_mem
(
void
){
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
);
int
ret
=
write
(
fp
,
log_mem_d
[
0
].
buf_p
,
log_mem_d
[
0
].
buf_index
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"{LOG} %s %d Couldn't write in %s
\n
"
,
__FILE__
,
__LINE__
,
f_name
);
exit
(
EXIT_FAILURE
);
}
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
);
ret
=
write
(
fp
,
log_mem_d
[
1
].
buf_p
,
log_mem_d
[
1
].
buf_index
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"{LOG} %s %d Couldn't write in %s
\n
"
,
__FILE__
,
__LINE__
,
f_name
);
exit
(
EXIT_FAILURE
);
}
close
(
fp
);
free
(
log_mem_d
[
1
].
buf_p
);
}
else
{
fp
=
open
(
log_mem_filename
,
O_WRONLY
|
O_CREAT
,
0666
);
int
ret
=
write
(
fp
,
log_mem_d
[
0
].
buf_p
,
log_mem_d
[
0
].
buf_index
);
if
(
ret
<
0
)
{
fprintf
(
stderr
,
"{LOG} %s %d Couldn't write in %s
\n
"
,
__FILE__
,
__LINE__
,
log_mem_filename
);
exit
(
EXIT_FAILURE
);
}
close
(
fp
);
free
(
log_mem_d
[
0
].
buf_p
);
}
}
}
#ifdef LOG_TEST
...
...
common/utils/LOG/log.h
View file @
4cd5d80d
...
...
@@ -118,6 +118,8 @@ extern "C" {
#define FLAG_NOCOLOR 0x0001
/*!< \brief use colors in log messages, depending on level */
#define FLAG_THREAD 0x0008
/*!< \brief display thread name in log messages */
#define FLAG_LEVEL 0x0010
/*!< \brief display log level in log messages */
#define FLAG_FUNCT 0x0020
#define FLAG_FILE_LINE 0x0040
#define FLAG_TIME 0x0100
#define FLAG_INITIALIZED 0x8000
...
...
@@ -307,6 +309,19 @@ int is_newline( char *str, int size);
int
register_log_component
(
char
*
name
,
char
*
fext
,
int
compidx
);
#define LOG_MEM_SIZE 100*1024*1024
#define LOG_MEM_FILE "./logmem.log"
void
flush_mem_to_file
(
void
);
void
log_output_memory
(
const
char
*
file
,
const
char
*
func
,
int
line
,
int
comp
,
int
level
,
const
char
*
format
,
va_list
args
);
int
logInit_log_mem
(
void
);
void
close_log_mem
(
void
);
typedef
struct
{
char
*
buf_p
;
int
buf_index
;
int
enable_flag
;
}
log_mem_cnt_t
;
/* @}*/
/*!\fn int32_t write_file_matlab(const char *fname, const char *vname, void *data, int length, int dec, char format);
...
...
common/utils/LOG/log_extern.h
View file @
4cd5d80d
...
...
@@ -27,4 +27,6 @@ extern log_t *g_log;
extern
mapping
log_level_names
[];
extern
mapping
log_options
[];
extern
mapping
log_maskmap
[];
extern
int
log_mem_flag
;
extern
char
*
log_mem_filename
;
extern
char
logmem_filename
[
1024
];
targets/RT/USER/lte-softmodem-common.c
View file @
4cd5d80d
...
...
@@ -60,6 +60,7 @@ void get_common_options(void) {
uint32_t
nonbiot
;
uint32_t
rfsim
;
uint32_t
basicsim
;
char
*
logmem_filename
=
NULL
;
paramdef_t
cmdline_params
[]
=
CMDLINE_PARAMS_DESC
;
paramdef_t
cmdline_logparams
[]
=
CMDLINE_LOGPARAMS_DESC
;
checkedparam_t
cmdline_log_CheckParams
[]
=
CMDLINE_LOGPARAMS_CHECK_DESC
;
...
...
@@ -80,6 +81,13 @@ void get_common_options(void) {
load_module_shlib
(
"telnetsrv"
,
NULL
,
0
,
NULL
);
}
if
(
logmem_filename
!=
NULL
&&
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
(
noS1
)
{
set_softmodem_optmask
(
SOFTMODEM_NOS1_BIT
);
}
...
...
targets/RT/USER/lte-softmodem.c
View file @
4cd5d80d
...
...
@@ -279,7 +279,7 @@ void exit_function(const char *file, const char *function, const int line, const
if
(
s
!=
NULL
)
{
printf
(
"%s:%d %s() Exiting OAI softmodem: %s
\n
"
,
file
,
line
,
function
,
s
);
}
close_log_mem
();
oai_exit
=
1
;
if
(
RC
.
ru
==
NULL
)
...
...
targets/RT/USER/lte-softmodem.h
View file @
4cd5d80d
...
...
@@ -222,6 +222,7 @@
{"g" , CONFIG_HLP_LOGL, 0, uptr:&glog_level, defintval:0, TYPE_UINT, 0}, \
{"telnetsrv", CONFIG_HLP_TELN, PARAMFLAG_BOOL, uptr:&start_telnetsrv, defintval:0, TYPE_UINT, 0}, \
{"msc", CONFIG_HLP_MSC, PARAMFLAG_BOOL, uptr:&START_MSC, defintval:0, TYPE_UINT, 0}, \
{"log-mem", NULL, 0, strptr:(char **)&logmem_filename, defstrval:NULL, TYPE_STRING, 0}, \
}
#define CMDLINE_ONLINELOG_IDX 0
#define CMDLINE_GLOGLEVEL_IDX 1
...
...
@@ -233,6 +234,7 @@
{ .s2= { config_check_intrange, {0,4}}}, \
{ .s5= {NULL }} , \
{ .s5= {NULL }} , \
{ .s5= {NULL }} , \
}
/***************************************************************************************************************************************/
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment