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_JELLYBEAN
     60 #define LOG ALOG
     61 #define LOG_ERRROR ANDROID_LOG_ERROR
     62 #endif
     63 
     64 /* --------------------------------------------------------------------- */
     65 
     66 /*
     67  * Normally we strip MPL_LOGV (VERBOSE messages) from release builds.
     68  * You can modify this (for example with "#define MPL_LOG_NDEBUG 0"
     69  * at the top of your source file) to change that behavior.
     70  */
     71 #ifndef MPL_LOG_NDEBUG
     72 #ifdef NDEBUG
     73 #define MPL_LOG_NDEBUG 1
     74 #else
     75 #define MPL_LOG_NDEBUG 0
     76 #endif
     77 #endif
     78 
     79 #ifdef __KERNEL__
     80 #define MPL_LOG_UNKNOWN MPL_LOG_VERBOSE
     81 #define MPL_LOG_DEFAULT KERN_DEFAULT
     82 #define MPL_LOG_VERBOSE KERN_CONT
     83 #define MPL_LOG_DEBUG   KERN_NOTICE
     84 #define MPL_LOG_INFO    KERN_INFO
     85 #define MPL_LOG_WARN    KERN_WARNING
     86 #define MPL_LOG_ERROR   KERN_ERR
     87 #define MPL_LOG_SILENT  MPL_LOG_VERBOSE
     88 
     89 #else
     90 	/* Based off the log priorities in android
     91 	   /system/core/include/android/log.h */
     92 #define MPL_LOG_UNKNOWN		(0)
     93 #define MPL_LOG_DEFAULT		(1)
     94 #define MPL_LOG_VERBOSE		(2)
     95 #define MPL_LOG_DEBUG		(3)
     96 #define MPL_LOG_INFO		(4)
     97 #define MPL_LOG_WARN		(5)
     98 #define MPL_LOG_ERROR		(6)
     99 #define MPL_LOG_SILENT		(8)
    100 #endif
    101 
    102 
    103 /*
    104  * This is the local tag used for the following simplified
    105  * logging macros.  You can change this preprocessor definition
    106  * before using the other macros to change the tag.
    107  */
    108 #ifndef MPL_LOG_TAG
    109 #ifdef __KERNEL__
    110 #define MPL_LOG_TAG
    111 #else
    112 #define MPL_LOG_TAG NULL
    113 #endif
    114 #endif
    115 
    116 /* --------------------------------------------------------------------- */
    117 
    118 /*
    119  * Simplified macro to send a verbose log message using the current MPL_LOG_TAG.
    120  */
    121 #ifndef MPL_LOGV
    122 #if MPL_LOG_NDEBUG
    123 #ifdef _WIN32
    124 #define MPL_LOGV(fmt, ...)						\
    125 	do {								\
    126         __pragma (warning(suppress : 4127 )) \
    127 		if (0)							\
    128 			MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
    129             __pragma (warning(suppress : 4127 )) \
    130     } while (0)
    131 #else
    132 #define MPL_LOGV(fmt, ...)						\
    133 	do {								\
    134 		if (0)							\
    135 			MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
    136     } while (0)
    137 #endif
    138 
    139 #else
    140 #define MPL_LOGV(fmt, ...) MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    141 #endif
    142 #endif
    143 
    144 #ifndef CONDITION
    145 #define CONDITION(cond)     ((cond) != 0)
    146 #endif
    147 
    148 #ifndef MPL_LOGV_IF
    149 #if MPL_LOG_NDEBUG
    150 #define MPL_LOGV_IF(cond, fmt, ...)  \
    151 	do { if (0) MPL_LOG(fmt, ##__VA_ARGS__); } while (0)
    152 #else
    153 #define MPL_LOGV_IF(cond, fmt, ...) \
    154 	((CONDITION(cond))						\
    155 		? MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \
    156 		: (void)0)
    157 #endif
    158 #endif
    159 
    160 /*
    161  * Simplified macro to send a debug log message using the current MPL_LOG_TAG.
    162  */
    163 #ifndef MPL_LOGD
    164 #define MPL_LOGD(fmt, ...) MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    165 #endif
    166 
    167 #ifndef MPL_LOGD_IF
    168 #define MPL_LOGD_IF(cond, fmt, ...) \
    169 	((CONDITION(cond))					       \
    170 		? MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
    171 		: (void)0)
    172 #endif
    173 
    174 /*
    175  * Simplified macro to send an info log message using the current MPL_LOG_TAG.
    176  */
    177 #ifndef MPL_LOGI
    178 #ifdef __KERNEL__
    179 #define MPL_LOGI(fmt, ...) pr_info(KERN_INFO MPL_LOG_TAG fmt, ##__VA_ARGS__)
    180 #else
    181 #define MPL_LOGI(fmt, ...) MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    182 #endif
    183 #endif
    184 
    185 #ifndef MPL_LOGI_IF
    186 #define MPL_LOGI_IF(cond, fmt, ...) \
    187 	((CONDITION(cond))                                              \
    188 		? MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
    189 		: (void)0)
    190 #endif
    191 
    192 /*
    193  * Simplified macro to send a warning log message using the current MPL_LOG_TAG.
    194  */
    195 #ifndef MPL_LOGW
    196 #ifdef __KERNEL__
    197 #define MPL_LOGW(fmt, ...) printk(KERN_WARNING MPL_LOG_TAG fmt, ##__VA_ARGS__)
    198 #else
    199 #define MPL_LOGW(fmt, ...) MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    200 #endif
    201 #endif
    202 
    203 #ifndef MPL_LOGW_IF
    204 #define MPL_LOGW_IF(cond, fmt, ...) \
    205 	((CONDITION(cond))					       \
    206 		? MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
    207 		: (void)0)
    208 #endif
    209 
    210 /*
    211  * Simplified macro to send an error log message using the current MPL_LOG_TAG.
    212  */
    213 #ifndef MPL_LOGE
    214 #ifdef __KERNEL__
    215 #define MPL_LOGE(fmt, ...) printk(KERN_ERR MPL_LOG_TAG fmt, ##__VA_ARGS__)
    216 #else
    217 #define MPL_LOGE(fmt, ...) MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
    218 #endif
    219 #endif
    220 
    221 #ifndef MPL_LOGE_IF
    222 #define MPL_LOGE_IF(cond, fmt, ...) \
    223 	((CONDITION(cond))					       \
    224 		? MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
    225 		: (void)0)
    226 #endif
    227 
    228 /* --------------------------------------------------------------------- */
    229 
    230 /*
    231  * Log a fatal error.  If the given condition fails, this stops program
    232  * execution like a normal assertion, but also generating the given message.
    233  * It is NOT stripped from release builds.  Note that the condition test
    234  * is -inverted- from the normal assert() semantics.
    235  */
    236 #define MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ...) \
    237 	((CONDITION(cond))					   \
    238 		? ((void)android_printAssert(#cond, MPL_LOG_TAG,   \
    239 						fmt, ##__VA_ARGS__))	\
    240 		: (void)0)
    241 
    242 #define MPL_LOG_ALWAYS_FATAL(fmt, ...) \
    243 	(((void)android_printAssert(NULL, MPL_LOG_TAG, fmt, ##__VA_ARGS__)))
    244 
    245 /*
    246  * Versions of MPL_LOG_ALWAYS_FATAL_IF and MPL_LOG_ALWAYS_FATAL that
    247  * are stripped out of release builds.
    248  */
    249 #if MPL_LOG_NDEBUG
    250 #define MPL_LOG_FATAL_IF(cond, fmt, ...)				\
    251 	do {								\
    252 		if (0)							\
    253 			MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__); \
    254 	} while (0)
    255 #define MPL_LOG_FATAL(fmt, ...)						\
    256 	do {								\
    257 		if (0)							\
    258 			MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)	\
    259 	} while (0)
    260 #else
    261 #define MPL_LOG_FATAL_IF(cond, fmt, ...) \
    262 	MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__)
    263 #define MPL_LOG_FATAL(fmt, ...) \
    264 	MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)
    265 #endif
    266 
    267 /*
    268  * Assertion that generates a log message when the assertion fails.
    269  * Stripped out of release builds.  Uses the current MPL_LOG_TAG.
    270  */
    271 #define MPL_LOG_ASSERT(cond, fmt, ...)			\
    272 	MPL_LOG_FATAL_IF(!(cond), fmt, ##__VA_ARGS__)
    273 
    274 /* --------------------------------------------------------------------- */
    275 
    276 /*
    277  * Basic log message macro.
    278  *
    279  * Example:
    280  *  MPL_LOG(MPL_LOG_WARN, NULL, "Failed with error %d", errno);
    281  *
    282  * The second argument may be NULL or "" to indicate the "global" tag.
    283  */
    284 #ifndef MPL_LOG
    285 #define MPL_LOG(priority, tag, fmt, ...)		\
    286 	MPL_LOG_PRI(priority, tag, fmt, ##__VA_ARGS__)
    287 #endif
    288 
    289 /*
    290  * Log macro that allows you to specify a number for the priority.
    291  */
    292 #ifndef MPL_LOG_PRI
    293 #ifdef ANDROID
    294 #define MPL_LOG_PRI(priority, tag, fmt, ...) \
    295 	LOG(priority, tag, fmt, ##__VA_ARGS__)
    296 #elif defined __KERNEL__
    297 #define MPL_LOG_PRI(priority, tag, fmt, ...) \
    298 	pr_debug(MPL_##priority tag fmt, ##__VA_ARGS__)
    299 #else
    300 #define MPL_LOG_PRI(priority, tag, fmt, ...) \
    301 	_MLPrintLog(MPL_##priority, tag, fmt, ##__VA_ARGS__)
    302 #endif
    303 #endif
    304 
    305 /*
    306  * Log macro that allows you to pass in a varargs ("args" is a va_list).
    307  */
    308 #ifndef MPL_LOG_PRI_VA
    309 #ifdef ANDROID
    310 #define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
    311 	android_vprintLog(priority, NULL, tag, fmt, args)
    312 #elif defined __KERNEL__
    313 /* not allowed in the Kernel because there is no dev_dbg that takes a va_list */
    314 #else
    315 #define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
    316 	_MLPrintVaLog(priority, NULL, tag, fmt, args)
    317 #endif
    318 #endif
    319 
    320 /* --------------------------------------------------------------------- */
    321 
    322 /*
    323  * ===========================================================================
    324  *
    325  * The stuff in the rest of this file should not be used directly.
    326  */
    327 
    328 #ifndef ANDROID
    329 int _MLPrintLog(int priority, const char *tag, const char *fmt,	...);
    330 int _MLPrintVaLog(int priority, const char *tag, const char *fmt, va_list args);
    331 /* Final implementation of actual writing to a character device */
    332 int _MLWriteLog(const char *buf, int buflen);
    333 #endif
    334 
    335 static inline void __print_result_location(int result,
    336 					   const char *file,
    337 					   const char *func, int line)
    338 {
    339 	MPL_LOGE("%s|%s|%d returning %d\n", file, func, line, result);
    340 }
    341 
    342 #ifdef _WIN32
    343 /* The pragma removes warning about expression being constant */
    344 #define LOG_RESULT_LOCATION(condition) \
    345     do {								\
    346 		__print_result_location((int)(condition), __FILE__,	\
    347 					__func__, __LINE__);		\
    348         __pragma (warning(suppress : 4127 )) \
    349 	} while (0)
    350 #else
    351 #define LOG_RESULT_LOCATION(condition) \
    352     do {								\
    353 		__print_result_location((int)(condition), __FILE__,	\
    354 					__func__, __LINE__);		\
    355 	} while (0)
    356 #endif
    357 
    358 
    359 #define INV_ERROR_CHECK(r_1329) \
    360     if (r_1329) { \
    361         LOG_RESULT_LOCATION(r_1329); \
    362         return r_1329; \
    363     }
    364 
    365 #ifdef __cplusplus
    366 }
    367 #endif
    368 #endif				/* _LIBS_CUTILS_MPL_LOG_H */
    369