149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow $License: 349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. 449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow $ 549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * This file incorporates work covered by the following copyright and 949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * permission notice: 1049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 1149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Copyright (C) 2005 The Android Open Source Project 1249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 1349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Licensed under the Apache License, Version 2.0 (the "License"); 1449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * you may not use this file except in compliance with the License. 1549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * You may obtain a copy of the License at 1649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 1749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * http://www.apache.org/licenses/LICENSE-2.0 1849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 1949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Unless required by applicable law or agreed to in writing, software 2049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * distributed under the License is distributed on an "AS IS" BASIS, 2149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 2249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * See the License for the specific language governing permissions and 2349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * limitations under the License. 2449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 2549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 2649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 2749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * C/C++ logging functions. See the logging documentation for API details. 2849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 2949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * We'd like these to be available from C code (in case we import some from 3049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * somewhere), so this has a C interface. 3149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 3249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * The output will be correct when the log file is shared between multiple 3349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * threads and/or multiple processes so long as the operating system 3449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * supports O_APPEND. These calls have mutex-protected data structures 3549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * and so are NOT reentrant. Do not use MPL_LOG in a signal handler. 3649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 3749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef _LIBS_CUTILS_MPL_LOG_H 3849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define _LIBS_CUTILS_MPL_LOG_H 3949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 4049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdlib.h> 4149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdarg.h> 4249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 4349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef ANDROID 4449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef NDK_BUILD 4549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "log_macros.h" 4649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 4749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <utils/Log.h> /* For the LOG macro */ 4849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 4949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 5049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 5149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef __KERNEL__ 5249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <linux/kernel.h> 5349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 5449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 5549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef __cplusplus 5649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowextern "C" { 5749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 5849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 5949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#if defined ANDROID_JELLYBEAN 6049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOG ALOG 6149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOG_ERRROR ANDROID_LOG_ERROR 6249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 6349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 6449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* --------------------------------------------------------------------- */ 6549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 6649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 6749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Normally we strip MPL_LOGV (VERBOSE messages) from release builds. 6849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * You can modify this (for example with "#define MPL_LOG_NDEBUG 0" 6949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * at the top of your source file) to change that behavior. 7049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 7149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOG_NDEBUG 7249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef NDEBUG 7349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_NDEBUG 1 7449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 7549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_NDEBUG 0 7649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 7749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 7849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 7949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef __KERNEL__ 8049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_UNKNOWN MPL_LOG_VERBOSE 8149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_DEFAULT KERN_DEFAULT 8249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_VERBOSE KERN_CONT 8349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_DEBUG KERN_NOTICE 8449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_INFO KERN_INFO 8549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_WARN KERN_WARNING 8649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_ERROR KERN_ERR 8749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_SILENT MPL_LOG_VERBOSE 8849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 8949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 9049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow /* Based off the log priorities in android 9149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow /system/core/include/android/log.h */ 9249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_UNKNOWN (0) 9349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_DEFAULT (1) 9449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_VERBOSE (2) 9549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_DEBUG (3) 9649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_INFO (4) 9749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_WARN (5) 9849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_ERROR (6) 9949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_SILENT (8) 10049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 10149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 10249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 10349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 10449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * This is the local tag used for the following simplified 10549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * logging macros. You can change this preprocessor definition 10649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * before using the other macros to change the tag. 10749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 10849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOG_TAG 10949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef __KERNEL__ 11049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_TAG 11149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 11249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_TAG NULL 11349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 11449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 11549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 11649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* --------------------------------------------------------------------- */ 11749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 11849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 11949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Simplified macro to send a verbose log message using the current MPL_LOG_TAG. 12049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 12149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOGV 12249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#if MPL_LOG_NDEBUG 12349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef _WIN32 12449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGV(fmt, ...) \ 12549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow do { \ 12649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __pragma (warning(suppress : 4127 )) \ 12749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (0) \ 12849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\ 12949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __pragma (warning(suppress : 4127 )) \ 13049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } while (0) 13149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 13249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGV(fmt, ...) \ 13349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow do { \ 13449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (0) \ 13549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\ 13649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } while (0) 13749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 13849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 13949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 14049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGV(fmt, ...) MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__) 14149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 14249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 14349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 14449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef CONDITION 14549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define CONDITION(cond) ((cond) != 0) 14649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 14749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 14849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOGV_IF 14949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#if MPL_LOG_NDEBUG 15049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGV_IF(cond, fmt, ...) \ 15149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow do { if (0) MPL_LOG(fmt, ##__VA_ARGS__); } while (0) 15249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 15349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGV_IF(cond, fmt, ...) \ 15449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ((CONDITION(cond)) \ 15549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ? MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \ 15649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow : (void)0) 15749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 15849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 15949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 16049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 16149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Simplified macro to send a debug log message using the current MPL_LOG_TAG. 16249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 16349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOGD 16449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGD(fmt, ...) MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__) 16549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 16649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 16749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOGD_IF 16849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGD_IF(cond, fmt, ...) \ 16949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ((CONDITION(cond)) \ 17049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ? MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \ 17149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow : (void)0) 17249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 17349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 17449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 17549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Simplified macro to send an info log message using the current MPL_LOG_TAG. 17649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 17749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOGI 17849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef __KERNEL__ 17949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGI(fmt, ...) pr_info(KERN_INFO MPL_LOG_TAG fmt, ##__VA_ARGS__) 18049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 18149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGI(fmt, ...) MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__) 18249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 18349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 18449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 18549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOGI_IF 18649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGI_IF(cond, fmt, ...) \ 18749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ((CONDITION(cond)) \ 18849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ? MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \ 18949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow : (void)0) 19049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 19149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 19249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 19349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Simplified macro to send a warning log message using the current MPL_LOG_TAG. 19449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 19549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOGW 19649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef __KERNEL__ 19749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGW(fmt, ...) printk(KERN_WARNING MPL_LOG_TAG fmt, ##__VA_ARGS__) 19849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 19949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGW(fmt, ...) MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__) 20049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 20149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 20249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 20349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOGW_IF 20449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGW_IF(cond, fmt, ...) \ 20549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ((CONDITION(cond)) \ 20649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ? MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \ 20749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow : (void)0) 20849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 20949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 21049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 21149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Simplified macro to send an error log message using the current MPL_LOG_TAG. 21249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 21349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOGE 21449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef __KERNEL__ 21549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGE(fmt, ...) printk(KERN_ERR MPL_LOG_TAG fmt, ##__VA_ARGS__) 21649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 21749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGE(fmt, ...) MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__) 21849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 21949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 22049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 22149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOGE_IF 22249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOGE_IF(cond, fmt, ...) \ 22349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ((CONDITION(cond)) \ 22449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ? MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \ 22549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow : (void)0) 22649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 22749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 22849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* --------------------------------------------------------------------- */ 22949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 23049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 23149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Log a fatal error. If the given condition fails, this stops program 23249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * execution like a normal assertion, but also generating the given message. 23349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * It is NOT stripped from release builds. Note that the condition test 23449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * is -inverted- from the normal assert() semantics. 23549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 23649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ...) \ 23749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ((CONDITION(cond)) \ 23849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow ? ((void)android_printAssert(#cond, MPL_LOG_TAG, \ 23949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow fmt, ##__VA_ARGS__)) \ 24049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow : (void)0) 24149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 24249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_ALWAYS_FATAL(fmt, ...) \ 24349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow (((void)android_printAssert(NULL, MPL_LOG_TAG, fmt, ##__VA_ARGS__))) 24449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 24549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 24649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Versions of MPL_LOG_ALWAYS_FATAL_IF and MPL_LOG_ALWAYS_FATAL that 24749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * are stripped out of release builds. 24849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 24949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#if MPL_LOG_NDEBUG 25049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_FATAL_IF(cond, fmt, ...) \ 25149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow do { \ 25249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (0) \ 25349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__); \ 25449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } while (0) 25549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_FATAL(fmt, ...) \ 25649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow do { \ 25749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (0) \ 25849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__) \ 25949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } while (0) 26049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 26149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_FATAL_IF(cond, fmt, ...) \ 26249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__) 26349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_FATAL(fmt, ...) \ 26449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__) 26549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 26649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 26749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 26849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Assertion that generates a log message when the assertion fails. 26949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Stripped out of release builds. Uses the current MPL_LOG_TAG. 27049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 27149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_ASSERT(cond, fmt, ...) \ 27249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow MPL_LOG_FATAL_IF(!(cond), fmt, ##__VA_ARGS__) 27349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 27449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* --------------------------------------------------------------------- */ 27549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 27649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 27749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Basic log message macro. 27849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 27949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Example: 28049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * MPL_LOG(MPL_LOG_WARN, NULL, "Failed with error %d", errno); 28149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 28249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * The second argument may be NULL or "" to indicate the "global" tag. 28349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 28449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOG 28549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG(priority, tag, fmt, ...) \ 28649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow MPL_LOG_PRI(priority, tag, fmt, ##__VA_ARGS__) 28749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 28849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 28949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 29049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Log macro that allows you to specify a number for the priority. 29149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 29249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOG_PRI 29349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef ANDROID 29449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_PRI(priority, tag, fmt, ...) \ 29549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow LOG(priority, tag, fmt, ##__VA_ARGS__) 29649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#elif defined __KERNEL__ 29749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_PRI(priority, tag, fmt, ...) \ 29849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow pr_debug(MPL_##priority tag fmt, ##__VA_ARGS__) 29949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 30049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_PRI(priority, tag, fmt, ...) \ 30149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow _MLPrintLog(MPL_##priority, tag, fmt, ##__VA_ARGS__) 30249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 30349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 30449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 30549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 30649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * Log macro that allows you to pass in a varargs ("args" is a va_list). 30749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 30849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef MPL_LOG_PRI_VA 30949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef ANDROID 31049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \ 31149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow android_vprintLog(priority, NULL, tag, fmt, args) 31249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#elif defined __KERNEL__ 31349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* not allowed in the Kernel because there is no dev_dbg that takes a va_list */ 31449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 31549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \ 31649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow _MLPrintVaLog(priority, NULL, tag, fmt, args) 31749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 31849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 31949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 32049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* --------------------------------------------------------------------- */ 32149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 32249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* 32349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * =========================================================================== 32449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * 32549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * The stuff in the rest of this file should not be used directly. 32649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */ 32749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 32849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifndef ANDROID 32949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint _MLPrintLog(int priority, const char *tag, const char *fmt, ...); 33049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint _MLPrintVaLog(int priority, const char *tag, const char *fmt, va_list args); 33149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* Final implementation of actual writing to a character device */ 33249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowint _MLWriteLog(const char *buf, int buflen); 33349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 33449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 33549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowstatic inline void __print_result_location(int result, 33649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow const char *file, 33749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow const char *func, int line) 33849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{ 33949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow MPL_LOGE("%s|%s|%d returning %d\n", file, func, line, result); 34049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 34149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 34249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef _WIN32 34349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/* The pragma removes warning about expression being constant */ 34449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOG_RESULT_LOCATION(condition) \ 34549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow do { \ 34649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __print_result_location((int)(condition), __FILE__, \ 34749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __func__, __LINE__); \ 34849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __pragma (warning(suppress : 4127 )) \ 34949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } while (0) 35049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#else 35149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOG_RESULT_LOCATION(condition) \ 35249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow do { \ 35349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __print_result_location((int)(condition), __FILE__, \ 35449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow __func__, __LINE__); \ 35549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } while (0) 35649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 35749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 35849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 35949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define INV_ERROR_CHECK(r_1329) \ 36049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow if (r_1329) { \ 36149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow LOG_RESULT_LOCATION(r_1329); \ 36249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow return r_1329; \ 36349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow } 36449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow 36549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#ifdef __cplusplus 36649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow} 36749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif 36849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#endif /* _LIBS_CUTILS_MPL_LOG_H */ 369