xref: /rockchip-linux_mpp/osal/mpp_log.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka  * Copyright (c) 2015 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka  */
5*437bfbebSnyanmisaka 
6*437bfbebSnyanmisaka #define MODULE_TAG "mpp_log"
7*437bfbebSnyanmisaka 
8*437bfbebSnyanmisaka #include <stdio.h>
9*437bfbebSnyanmisaka #include <string.h>
10*437bfbebSnyanmisaka 
11*437bfbebSnyanmisaka #include "mpp_env.h"
12*437bfbebSnyanmisaka #include "mpp_debug.h"
13*437bfbebSnyanmisaka #include "mpp_common.h"
14*437bfbebSnyanmisaka 
15*437bfbebSnyanmisaka #include "os_log.h"
16*437bfbebSnyanmisaka 
17*437bfbebSnyanmisaka #define MPP_LOG_MAX_LEN     256
18*437bfbebSnyanmisaka 
19*437bfbebSnyanmisaka #ifdef __cplusplus
20*437bfbebSnyanmisaka extern "C" {
21*437bfbebSnyanmisaka #endif
22*437bfbebSnyanmisaka 
23*437bfbebSnyanmisaka RK_U32 mpp_debug = 0;
24*437bfbebSnyanmisaka 
25*437bfbebSnyanmisaka // TODO: add log timing information and switch flag
26*437bfbebSnyanmisaka static const char *msg_log_warning = "log message is long\n";
27*437bfbebSnyanmisaka static const char *msg_log_nothing = "\n";
28*437bfbebSnyanmisaka static int mpp_log_level = MPP_LOG_INFO;
29*437bfbebSnyanmisaka static MppLogCb mpp_log_ext_cb = NULL;
30*437bfbebSnyanmisaka static void *mpp_log_ext_ctx = NULL;
31*437bfbebSnyanmisaka 
32*437bfbebSnyanmisaka static os_log_callback log_func[] = {
33*437bfbebSnyanmisaka     NULL,           /* MPP_LOG_DEFAULT */
34*437bfbebSnyanmisaka     os_log_fatal,   /* MPP_LOG_FATAL   */
35*437bfbebSnyanmisaka     os_log_error,   /* MPP_LOG_ERROR   */
36*437bfbebSnyanmisaka     os_log_warn,    /* MPP_LOG_WARN   */
37*437bfbebSnyanmisaka     os_log_info,    /* MPP_LOG_INFO    */
38*437bfbebSnyanmisaka     os_log_debug,   /* MPP_LOG_DEBUG   */
39*437bfbebSnyanmisaka     os_log_trace,   /* MPP_LOG_VERBOSE */
40*437bfbebSnyanmisaka     os_log_info,    /* MPP_LOG_DEFAULT */
41*437bfbebSnyanmisaka };
42*437bfbebSnyanmisaka 
__mpp_log(os_log_callback func,const char * tag,const char * fmt,const char * fname,va_list args)43*437bfbebSnyanmisaka static void __mpp_log(os_log_callback func, const char *tag, const char *fmt,
44*437bfbebSnyanmisaka                       const char *fname, va_list args)
45*437bfbebSnyanmisaka {
46*437bfbebSnyanmisaka     char msg[MPP_LOG_MAX_LEN + 1];
47*437bfbebSnyanmisaka     char *tmp = msg;
48*437bfbebSnyanmisaka     const char *buf = fmt;
49*437bfbebSnyanmisaka     size_t len_fmt  = strnlen(fmt, MPP_LOG_MAX_LEN);
50*437bfbebSnyanmisaka     size_t len_name = (fname) ? (strnlen(fname, MPP_LOG_MAX_LEN)) : (0);
51*437bfbebSnyanmisaka     size_t buf_left = MPP_LOG_MAX_LEN;
52*437bfbebSnyanmisaka     size_t len_all  = len_fmt + len_name;
53*437bfbebSnyanmisaka 
54*437bfbebSnyanmisaka     if (NULL == tag)
55*437bfbebSnyanmisaka         tag = MODULE_TAG;
56*437bfbebSnyanmisaka 
57*437bfbebSnyanmisaka     if (len_name) {
58*437bfbebSnyanmisaka         buf = msg;
59*437bfbebSnyanmisaka         buf_left -= snprintf(msg, buf_left, "%s ", fname);
60*437bfbebSnyanmisaka         tmp += len_name + 1;
61*437bfbebSnyanmisaka     }
62*437bfbebSnyanmisaka 
63*437bfbebSnyanmisaka     if (len_all == 0) {
64*437bfbebSnyanmisaka         buf = msg_log_nothing;
65*437bfbebSnyanmisaka     } else if (len_all >= MPP_LOG_MAX_LEN) {
66*437bfbebSnyanmisaka         buf_left -= snprintf(tmp, buf_left, "%s", msg_log_warning);
67*437bfbebSnyanmisaka         buf = msg;
68*437bfbebSnyanmisaka     } else {
69*437bfbebSnyanmisaka         snprintf(tmp, buf_left, "%s", fmt);
70*437bfbebSnyanmisaka         if (fmt[len_fmt - 1] != '\n') {
71*437bfbebSnyanmisaka             tmp[len_fmt]    = '\n';
72*437bfbebSnyanmisaka             tmp[len_fmt + 1]  = '\0';
73*437bfbebSnyanmisaka         }
74*437bfbebSnyanmisaka         buf = msg;
75*437bfbebSnyanmisaka     }
76*437bfbebSnyanmisaka 
77*437bfbebSnyanmisaka     func(tag, buf, args);
78*437bfbebSnyanmisaka }
79*437bfbebSnyanmisaka 
_mpp_log(const char * tag,const char * fmt,const char * fname,...)80*437bfbebSnyanmisaka void _mpp_log(const char *tag, const char *fmt, const char *fname, ...)
81*437bfbebSnyanmisaka {
82*437bfbebSnyanmisaka     va_list args;
83*437bfbebSnyanmisaka 
84*437bfbebSnyanmisaka     mpp_logw("warning: use new logx function\n");
85*437bfbebSnyanmisaka 
86*437bfbebSnyanmisaka     va_start(args, fname);
87*437bfbebSnyanmisaka     __mpp_log(os_log_info, tag, fmt, fname, args);
88*437bfbebSnyanmisaka     va_end(args);
89*437bfbebSnyanmisaka }
90*437bfbebSnyanmisaka 
_mpp_err(const char * tag,const char * fmt,const char * fname,...)91*437bfbebSnyanmisaka void _mpp_err(const char *tag, const char *fmt, const char *fname, ...)
92*437bfbebSnyanmisaka {
93*437bfbebSnyanmisaka     va_list args;
94*437bfbebSnyanmisaka 
95*437bfbebSnyanmisaka     mpp_logw("warning: use new logx function\n");
96*437bfbebSnyanmisaka 
97*437bfbebSnyanmisaka     va_start(args, fname);
98*437bfbebSnyanmisaka     __mpp_log(os_log_error, tag, fmt, fname, args);
99*437bfbebSnyanmisaka     va_end(args);
100*437bfbebSnyanmisaka }
101*437bfbebSnyanmisaka 
_mpp_log_l(int level,const char * tag,const char * fmt,const char * fname,...)102*437bfbebSnyanmisaka void _mpp_log_l(int level, const char *tag, const char *fmt, const char *fname, ...)
103*437bfbebSnyanmisaka {
104*437bfbebSnyanmisaka     va_list args;
105*437bfbebSnyanmisaka     int log_level;
106*437bfbebSnyanmisaka 
107*437bfbebSnyanmisaka     if (mpp_log_ext_cb) {
108*437bfbebSnyanmisaka         va_start(args, fname);
109*437bfbebSnyanmisaka         mpp_log_ext_cb(mpp_log_ext_ctx, level, tag, fmt, fname, args);
110*437bfbebSnyanmisaka         va_end(args);
111*437bfbebSnyanmisaka         return;
112*437bfbebSnyanmisaka     }
113*437bfbebSnyanmisaka 
114*437bfbebSnyanmisaka     if (level <= MPP_LOG_UNKNOWN || level >= MPP_LOG_SILENT)
115*437bfbebSnyanmisaka         return;
116*437bfbebSnyanmisaka 
117*437bfbebSnyanmisaka     log_level = mpp_log_level;
118*437bfbebSnyanmisaka     if (log_level >= MPP_LOG_SILENT)
119*437bfbebSnyanmisaka         return;
120*437bfbebSnyanmisaka 
121*437bfbebSnyanmisaka     if (level > log_level)
122*437bfbebSnyanmisaka         return;
123*437bfbebSnyanmisaka 
124*437bfbebSnyanmisaka     va_start(args, fname);
125*437bfbebSnyanmisaka     __mpp_log(log_func[level], tag, fmt, fname, args);
126*437bfbebSnyanmisaka     va_end(args);
127*437bfbebSnyanmisaka }
128*437bfbebSnyanmisaka 
mpp_llog(int level,const char * tag,const char * fmt,const char * fname,...)129*437bfbebSnyanmisaka void mpp_llog(int level, const char *tag, const char *fmt, const char *fname, ...)
130*437bfbebSnyanmisaka {
131*437bfbebSnyanmisaka     va_list args;
132*437bfbebSnyanmisaka     char *log_buf = NULL;
133*437bfbebSnyanmisaka     int log_size = SZ_1K;
134*437bfbebSnyanmisaka     int log_base = 0;
135*437bfbebSnyanmisaka     int log_len = 0;
136*437bfbebSnyanmisaka     int log_level;
137*437bfbebSnyanmisaka     int i;
138*437bfbebSnyanmisaka 
139*437bfbebSnyanmisaka     if (mpp_log_ext_cb) {
140*437bfbebSnyanmisaka         va_start(args, fname);
141*437bfbebSnyanmisaka         mpp_log_ext_cb(mpp_log_ext_ctx, level, tag, fmt, fname, args);
142*437bfbebSnyanmisaka         va_end(args);
143*437bfbebSnyanmisaka         return;
144*437bfbebSnyanmisaka     }
145*437bfbebSnyanmisaka 
146*437bfbebSnyanmisaka     if (level <= MPP_LOG_UNKNOWN || level >= MPP_LOG_SILENT)
147*437bfbebSnyanmisaka         return;
148*437bfbebSnyanmisaka 
149*437bfbebSnyanmisaka     log_level = mpp_log_level;
150*437bfbebSnyanmisaka     if (log_level >= MPP_LOG_SILENT)
151*437bfbebSnyanmisaka         return;
152*437bfbebSnyanmisaka 
153*437bfbebSnyanmisaka     if (level > log_level)
154*437bfbebSnyanmisaka         return;
155*437bfbebSnyanmisaka 
156*437bfbebSnyanmisaka     if (NULL == tag)
157*437bfbebSnyanmisaka         tag = MODULE_TAG;
158*437bfbebSnyanmisaka 
159*437bfbebSnyanmisaka 
160*437bfbebSnyanmisaka     va_start(args, fname);
161*437bfbebSnyanmisaka 
162*437bfbebSnyanmisaka     /* get log len and create buffer */
163*437bfbebSnyanmisaka     do {
164*437bfbebSnyanmisaka         log_buf = (char *)malloc(log_size);
165*437bfbebSnyanmisaka         if (!log_buf)
166*437bfbebSnyanmisaka             break;
167*437bfbebSnyanmisaka 
168*437bfbebSnyanmisaka         log_len = vsnprintf(log_buf, log_size - 1, fmt, args);
169*437bfbebSnyanmisaka         if (log_len < log_size - 1)
170*437bfbebSnyanmisaka             break;
171*437bfbebSnyanmisaka 
172*437bfbebSnyanmisaka         free(log_buf);
173*437bfbebSnyanmisaka         log_size <<= 1;
174*437bfbebSnyanmisaka     } while (1);
175*437bfbebSnyanmisaka 
176*437bfbebSnyanmisaka     va_end(args);
177*437bfbebSnyanmisaka 
178*437bfbebSnyanmisaka     for (i = 0; i < log_len; i++) {
179*437bfbebSnyanmisaka         if (log_buf[i] == '\n') {
180*437bfbebSnyanmisaka             /* skip empty line */
181*437bfbebSnyanmisaka             if (log_base < i) {
182*437bfbebSnyanmisaka                 log_buf[i] = '\0';
183*437bfbebSnyanmisaka                 log_func[level](tag, log_buf + log_base, args);
184*437bfbebSnyanmisaka                 /* restore \n */
185*437bfbebSnyanmisaka                 log_buf[i] = '\n';
186*437bfbebSnyanmisaka             }
187*437bfbebSnyanmisaka 
188*437bfbebSnyanmisaka             log_base = i + 1;
189*437bfbebSnyanmisaka         }
190*437bfbebSnyanmisaka     }
191*437bfbebSnyanmisaka 
192*437bfbebSnyanmisaka     if (log_buf)
193*437bfbebSnyanmisaka         free(log_buf);
194*437bfbebSnyanmisaka }
195*437bfbebSnyanmisaka 
mpp_set_log_level(int level)196*437bfbebSnyanmisaka void mpp_set_log_level(int level)
197*437bfbebSnyanmisaka {
198*437bfbebSnyanmisaka     if (level <= MPP_LOG_UNKNOWN || level > MPP_LOG_SILENT) {
199*437bfbebSnyanmisaka         mpp_logw("log level should in range [%d : %d] invalid intput %d\n",
200*437bfbebSnyanmisaka                  MPP_LOG_FATAL, MPP_LOG_SILENT, level);
201*437bfbebSnyanmisaka         level = MPP_LOG_INFO;
202*437bfbebSnyanmisaka     }
203*437bfbebSnyanmisaka 
204*437bfbebSnyanmisaka     mpp_log_level = level;
205*437bfbebSnyanmisaka }
206*437bfbebSnyanmisaka 
mpp_get_log_level(void)207*437bfbebSnyanmisaka int mpp_get_log_level(void)
208*437bfbebSnyanmisaka {
209*437bfbebSnyanmisaka     int level;
210*437bfbebSnyanmisaka 
211*437bfbebSnyanmisaka     mpp_env_get_u32("mpp_log_level", (RK_U32 *)&level, mpp_log_level);
212*437bfbebSnyanmisaka 
213*437bfbebSnyanmisaka     if (level <= MPP_LOG_UNKNOWN || level > MPP_LOG_SILENT)
214*437bfbebSnyanmisaka         level = MPP_LOG_INFO;
215*437bfbebSnyanmisaka 
216*437bfbebSnyanmisaka     mpp_log_level = level;
217*437bfbebSnyanmisaka 
218*437bfbebSnyanmisaka     return level;
219*437bfbebSnyanmisaka }
220*437bfbebSnyanmisaka 
mpp_set_log_callback(void * ctx,MppLogCb cb)221*437bfbebSnyanmisaka int mpp_set_log_callback(void *ctx, MppLogCb cb)
222*437bfbebSnyanmisaka {
223*437bfbebSnyanmisaka     mpp_log_ext_cb = cb;
224*437bfbebSnyanmisaka     mpp_log_ext_ctx = ctx;
225*437bfbebSnyanmisaka 
226*437bfbebSnyanmisaka     return 0;
227*437bfbebSnyanmisaka }
228*437bfbebSnyanmisaka 
229*437bfbebSnyanmisaka #ifdef __cplusplus
230*437bfbebSnyanmisaka }
231*437bfbebSnyanmisaka #endif
232