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