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