Home | History | Annotate | Download | only in include
      1 /*
      2  $License:
      3     Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
      4  $
      5  */
      6 
      7 /*
      8  * This file incorporates work covered by the following copyright and
      9  * permission notice:
     10  *
     11  * Copyright (C) 2005 The Android Open Source Project
     12  *
     13  * Licensed under the Apache License, Version 2.0 (the "License");
     14  * you may not use this file except in compliance with the License.
     15  * You may obtain a copy of the License at
     16  *
     17  *      http://www.apache.org/licenses/LICENSE-2.0
     18  *
     19  * Unless required by applicable law or agreed to in writing, software
     20  * distributed under the License is distributed on an "AS IS" BASIS,
     21  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     22  * See the License for the specific language governing permissions and
     23  * limitations under the License.
     24  */
     25 
     26 /*
     27  * C/C++ logging functions.  See the logging documentation for API details.
     28  *
     29  * We'd like these to be available from C code (in case we import some from
     30  * somewhere), so this has a C interface.
     31  *
     32  * The output will be correct when the log file is shared between multiple
     33  * threads and/or multiple processes so long as the operating system
     34  * supports O_APPEND.  These calls have mutex-protected data structures
     35  * and so are NOT reentrant.  Do not use MPL_LOG in a signal handler.
     36  */
     37 #ifndef _LIBS_CUTILS_MPL_LOG_H
     38 #define _LIBS_CUTILS_MPL_LOG_H
     39 
     40 #include <stdlib.h>
     41 #include <stdarg.h>
     42 
     43 #ifdef ANDROID
     44 #ifdef NDK_BUILD
     45 #include "log_macros.h"
     46 #else
     47 #include <utils/Log.h>		/* For the LOG macro */
     48 #endif
     49 #endif
     50 
     51 #ifdef __KERNEL__
     52 #include <linux/kernel.h>
     53 #endif
     54 
     55 #ifdef __cplusplus
     56 extern "C" {
     57 #endif
     58 
     59 #if defined ANDROID_LOLLIPOP
     60 //--yd
     61 #define LOG ALOG
     62 #endif
     63 
     64 #if defined ANDROID_JELLYBEAN || defined ANDROID_KITKAT
     65 #define LOG ALOG
     66 #define LOG_ERRROR ANDROID_LOG_ERROR
     67 #endif
     68 
     69 /* --------------------------------------------------------------------- */
     70 
     71 /*
     72  * Normally we strip MPL_LOGV (VERBOSE messages) from release builds.
     73  * You can modify this (for example with "#define MPL_LOG_NDEBUG 0"
     74  * at the top of your source file) to change that behavior.
     75  */
     76 #ifndef MPL_LOG_NDEBUG
     77 #ifdef NDEBUG
     78 #define MPL_LOG_NDEBUG 1
     79 #else
     80 #define MPL_LOG_NDEBUG 0
     81 #endif
     82 #endif
     83 
     84 #ifdef __KERNEL__
     85 #define MPL_LOG_UNKNOWN MPL_LOG_VERBOSE
     86 #define MPL_LOG_DEFAULT KERN_DEFAULT
     87 #define MPL_LOG_VERBOSE KERN_CONT
     88 #define MPL_LOG_DEBUG   KERN_NOTICE
     89 #define MPL_LOG_INFO    KERN_INFO
     90 #define MPL_LOG_WARN    KERN_WARNING
     91 #define MPL_LOG_ERROR   KERN_ERR
     92 #define MPL_LOG_SILENT  MPL_LOG_VERBOSE
     93 
     94 #else
     95 	/* Based off the log priorities in android
     96 	   /system/core/include/android/log.h */
     97 #if defined ANDROID_LOLLIPOP
     98 //--yd
     99 #define MPL_LOG_UNKNOWN		LOG_UNKNOWN
    100 #define MPL_LOG_DEFAULT		LOG_DEFAULT
    101 #define MPL_LOG_VERBOSE		LOG_VERBOSE
    102 #define MPL_LOG_DEBUG		LOG_DEBUG
    103 #define MPL_LOG_INFO		LOG_INFO
    104 #define MPL_LOG_WARN		LOG_WARN
    105 #define MPL_LOG_ERROR		LOG_ERROR
    106 //--yd #define MPL_LOG_FATAL		LOG_FATAL
    107 #define MPL_LOG_SILENT		LOG_SILENT
    108 #else
    109 #define MPL_LOG_UNKNOWN		(0)
    110 #define MPL_LOG_DEFAULT		(1)
    111 #define MPL_LOG_VERBOSE		(2)
    112 #define MPL_LOG_DEBUG		(3)
    113 #define MPL_LOG_INFO		(4)
    114 #define MPL_LOG_WARN		(5)
    115 #define MPL_LOG_ERROR		(6)
    116 #define MPL_LOG_SILENT		(8)
    117 #endif
    118 #endif
    119 
    120 
    121 /*
    122  * This is the local tag used for the following simplified
    123  * logging macros.  You can change this preprocessor definition
    124  * before using the other macros to change the tag.
    125  */
    126 #ifndef MPL_LOG_TAG
    127 #ifdef __KERNEL__
    128 #define MPL_LOG_TAG
    129 #else
    130 #define MPL_LOG_TAG NULL
    131 #endif
    132 #endif
    133 
    134 /* --------------------------------------------------------------------- */
    135 
    136 /*
    137  * Simplified macro to send a verbose log message using the current MPL_LOG_TAG.
    138  */
    139 #ifndef MPL_LOGV
    140 #if MPL_LOG_NDEBUG
    141 #ifdef _WIN32
    142 #define MPL_LOGV(fmt, ...)						\
    143 	do {								\
    144         __pragma (warning(suppress : 4127 )) \
    145 		if (0)							\
    146 			MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
    147             __pragma (warning(suppress : 4127 )) \
    148     } while (0)
    149 #else
    150 #if defined ANDROID_LOLLIPOP
    151 //--yd
    152 #define MPL_LOGV(fmt, ...)						\
    153 	do {								\
    154 		if (0)							\
    155 			MPL_LOG(MPL_LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
    156     } while (0)
    157 #else
    158 #define MPL_LOGV(fmt, ...)						\
    159 	do {								\
    160 		if (0)							\
    161 			MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
    162     } while (0)
    163 #endif
    164 #endif
    165 #else
    166 #if defined ANDROID_LOLLIPOP
    167 //--yd
    168 #define MPL_LOGV(fmt, ...) MPL_LOG(MPL_LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    169 #else
    170 #define MPL_LOGV(fmt, ...) MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    171 #endif
    172 #endif
    173 #endif
    174 
    175 #ifndef CONDITION
    176 #define CONDITION(cond)     ((cond) != 0)
    177 #endif
    178 
    179 #ifndef MPL_LOGV_IF
    180 #if MPL_LOG_NDEBUG
    181 #define MPL_LOGV_IF(cond, fmt, ...)  \
    182 	do { if (0) MPL_LOG(fmt, ##__VA_ARGS__); } while (0)
    183 #else
    184 #define MPL_LOGV_IF(cond, fmt, ...) \
    185 	((CONDITION(cond))						\
    186 		? MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \
    187 		: (void)0)
    188 #endif
    189 #endif
    190 
    191 /*
    192  * Simplified macro to send a debug log message using the current MPL_LOG_TAG.
    193  */
    194 #ifndef MPL_LOGD
    195 #if defined ANDROID_LOLLIPOP
    196 //--yd
    197 #define MPL_LOGD(fmt, ...) MPL_LOG(MPL_LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    198 #else
    199 #define MPL_LOGD(fmt, ...) MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    200 #endif
    201 #endif
    202 
    203 #ifndef MPL_LOGD_IF
    204 #define MPL_LOGD_IF(cond, fmt, ...) \
    205 	((CONDITION(cond))					       \
    206 		? MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
    207 		: (void)0)
    208 #endif
    209 
    210 /*
    211  * Simplified macro to send an info log message using the current MPL_LOG_TAG.
    212  */
    213 #ifndef MPL_LOGI
    214 #ifdef __KERNEL__
    215 #define MPL_LOGI(fmt, ...) pr_info(KERN_INFO MPL_LOG_TAG fmt, ##__VA_ARGS__)
    216 #else
    217 #if defined ANDROID_LOLLIPOP
    218 //--yd
    219 #define MPL_LOGI(fmt, ...) MPL_LOG(MPL_LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    220 #else
    221 #define MPL_LOGI(fmt, ...) MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    222 #endif
    223 #endif
    224 #endif
    225 
    226 #ifndef MPL_LOGI_IF
    227 #define MPL_LOGI_IF(cond, fmt, ...) \
    228 	((CONDITION(cond))                                              \
    229 		? MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
    230 		: (void)0)
    231 #endif
    232 
    233 /*
    234  * Simplified macro to send a warning log message using the current MPL_LOG_TAG.
    235  */
    236 #ifndef MPL_LOGW
    237 #ifdef __KERNEL__
    238 #define MPL_LOGW(fmt, ...) printk(KERN_WARNING MPL_LOG_TAG fmt, ##__VA_ARGS__)
    239 #else
    240 #define MPL_LOGW(fmt, ...) MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    241 #endif
    242 #endif
    243 
    244 #ifndef MPL_LOGW_IF
    245 #define MPL_LOGW_IF(cond, fmt, ...) \
    246 	((CONDITION(cond))					       \
    247 		? MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
    248 		: (void)0)
    249 #endif
    250 
    251 /*
    252  * Simplified macro to send an error log message using the current MPL_LOG_TAG.
    253  */
    254 #ifndef MPL_LOGE
    255 #ifdef __KERNEL__
    256 #define MPL_LOGE(fmt, ...) printk(KERN_ERR MPL_LOG_TAG fmt, ##__VA_ARGS__)
    257 #else
    258 #if defined ANDROID_LOLLIPOP
    259 //--yd
    260 #define MPL_LOGE(fmt, ...) MPL_LOG(MPL_LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    261 #else
    262 #define MPL_LOGE(fmt, ...) MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    263 #endif
    264 #endif
    265 #endif
    266 
    267 #ifndef MPL_LOGE_IF
    268 #if defined ANDROID_LOLLIPOP
    269 //--yd
    270 #define MPL_LOGE_IF(cond, fmt, ...) \
    271 	((CONDITION(cond))					       \
    272 		? MPL_LOG(MPL_LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
    273 		: (void)0)
    274 #else
    275 #define MPL_LOGE_IF(cond, fmt, ...) \
    276 	((CONDITION(cond))					       \
    277 		? MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
    278 		: (void)0)
    279 #endif
    280 #endif
    281 
    282 /* --------------------------------------------------------------------- */
    283 
    284 /*
    285  * Log a fatal error.  If the given condition fails, this stops program
    286  * execution like a normal assertion, but also generating the given message.
    287  * It is NOT stripped from release builds.  Note that the condition test
    288  * is -inverted- from the normal assert() semantics.
    289  */
    290 #define MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ...) \
    291 	((CONDITION(cond))					   \
    292 		? ((void)android_printAssert(#cond, MPL_LOG_TAG,   \
    293 						fmt, ##__VA_ARGS__))	\
    294 		: (void)0)
    295 
    296 #define MPL_LOG_ALWAYS_FATAL(fmt, ...) \
    297 	(((void)android_printAssert(NULL, MPL_LOG_TAG, fmt, ##__VA_ARGS__)))
    298 
    299 /*
    300  * Versions of MPL_LOG_ALWAYS_FATAL_IF and MPL_LOG_ALWAYS_FATAL that
    301  * are stripped out of release builds.
    302  */
    303 #if MPL_LOG_NDEBUG
    304 #define MPL_LOG_FATAL_IF(cond, fmt, ...)				\
    305 	do {								\
    306 		if (0)							\
    307 			MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__); \
    308 	} while (0)
    309 #define MPL_LOG_FATAL(fmt, ...)						\
    310 	do {								\
    311 		if (0)							\
    312 			MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)	\
    313 	} while (0)
    314 #else
    315 #define MPL_LOG_FATAL_IF(cond, fmt, ...) \
    316 	MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__)
    317 #define MPL_LOG_FATAL(fmt, ...) \
    318 	MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)
    319 #endif
    320 
    321 /*
    322  * Assertion that generates a log message when the assertion fails.
    323  * Stripped out of release builds.  Uses the current MPL_LOG_TAG.
    324  */
    325 #define MPL_LOG_ASSERT(cond, fmt, ...)			\
    326 	MPL_LOG_FATAL_IF(!(cond), fmt, ##__VA_ARGS__)
    327 
    328 /* --------------------------------------------------------------------- */
    329 
    330 /*
    331  * Basic log message macro.
    332  *
    333  * Example:
    334  *  MPL_LOG(MPL_LOG_WARN, NULL, "Failed with error %d", errno);
    335  *
    336  * The second argument may be NULL or "" to indicate the "global" tag.
    337  */
    338 #ifndef MPL_LOG
    339 #define MPL_LOG(priority, tag, fmt, ...)		\
    340 	MPL_LOG_PRI(priority, tag, fmt, ##__VA_ARGS__)
    341 #endif
    342 
    343 /*
    344  * Log macro that allows you to specify a number for the priority.
    345  */
    346 #ifndef MPL_LOG_PRI
    347 #ifdef ANDROID
    348 #define MPL_LOG_PRI(priority, tag, fmt, ...) \
    349 	LOG(priority, tag, fmt, ##__VA_ARGS__)
    350 #elif defined __KERNEL__
    351 #define MPL_LOG_PRI(priority, tag, fmt, ...) \
    352 	pr_debug(MPL_##priority tag fmt, ##__VA_ARGS__)
    353 #else
    354 #define MPL_LOG_PRI(priority, tag, fmt, ...) \
    355 	_MLPrintLog(MPL_##priority, tag, fmt, ##__VA_ARGS__)
    356 #endif
    357 #endif
    358 
    359 /*
    360  * Log macro that allows you to pass in a varargs ("args" is a va_list).
    361  */
    362 #ifndef MPL_LOG_PRI_VA
    363 #ifdef ANDROID
    364 #define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
    365 	android_vprintLog(priority, NULL, tag, fmt, args)
    366 #elif defined __KERNEL__
    367 /* not allowed in the Kernel because there is no dev_dbg that takes a va_list */
    368 #else
    369 #define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
    370 	_MLPrintVaLog(priority, NULL, tag, fmt, args)
    371 #endif
    372 #endif
    373 
    374 /* --------------------------------------------------------------------- */
    375 
    376 /*
    377  * ===========================================================================
    378  *
    379  * The stuff in the rest of this file should not be used directly.
    380  */
    381 
    382 #ifndef ANDROID
    383 int _MLPrintLog(int priority, const char *tag, const char *fmt,	...);
    384 int _MLPrintVaLog(int priority, const char *tag, const char *fmt, va_list args);
    385 /* Final implementation of actual writing to a character device */
    386 int _MLWriteLog(const char *buf, int buflen);
    387 #endif
    388 
    389 static inline void __print_result_location(int result,
    390 					   const char *file,
    391 					   const char *func, int line)
    392 {
    393 	MPL_LOGE("%s|%s|%d returning %d\n", file, func, line, result);
    394 }
    395 
    396 #ifdef _WIN32
    397 /* The pragma removes warning about expression being constant */
    398 #define LOG_RESULT_LOCATION(condition) \
    399     do {								\
    400 		__print_result_location((int)(condition), __FILE__,	\
    401 					__func__, __LINE__);		\
    402         __pragma (warning(suppress : 4127 )) \
    403 	} while (0)
    404 #else
    405 #define LOG_RESULT_LOCATION(condition) \
    406     do {								\
    407 		__print_result_location((int)(condition), __FILE__,	\
    408 					__func__, __LINE__);		\
    409 	} while (0)
    410 #endif
    411 
    412 
    413 #define INV_ERROR_CHECK(r_1329) \
    414     if (r_1329) { \
    415         LOG_RESULT_LOCATION(r_1329); \
    416         return r_1329; \
    417     }
    418 
    419 #ifdef __cplusplus
    420 }
    421 #endif
    422 #endif				/* _LIBS_CUTILS_MPL_LOG_H */
    423