log.h revision 7494581689b0fc1d8addd016b1c92d74d01f5ad4
17494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
27494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall $License:
37494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
47494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall $
57494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
67494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
77494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
87494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * This file incorporates work covered by the following copyright and
97494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * permission notice:
107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Copyright (C) 2005 The Android Open Source Project
127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Licensed under the Apache License, Version 2.0 (the "License");
147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * you may not use this file except in compliance with the License.
157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * You may obtain a copy of the License at
167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *      http://www.apache.org/licenses/LICENSE-2.0
187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Unless required by applicable law or agreed to in writing, software
207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * distributed under the License is distributed on an "AS IS" BASIS,
217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * See the License for the specific language governing permissions and
237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * limitations under the License.
247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * C/C++ logging functions.  See the logging documentation for API details.
287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * We'd like these to be available from C code (in case we import some from
307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * somewhere), so this has a C interface.
317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * The output will be correct when the log file is shared between multiple
337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * threads and/or multiple processes so long as the operating system
347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * supports O_APPEND.  These calls have mutex-protected data structures
357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * and so are NOT reentrant.  Do not use MPL_LOG in a signal handler.
367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef _LIBS_CUTILS_MPL_LOG_H
387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define _LIBS_CUTILS_MPL_LOG_H
397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include <stdarg.h>
417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include "local_log_def.h"
427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef ANDROID
447494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef NDK_BUILD
457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include "log_macros.h"
467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include <utils/Log.h>		/* For the LOG macro */
487494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __KERNEL__
527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include <linux/kernel.h>
537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
547494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
557494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __cplusplus
567494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallextern "C" {
577494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
587494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
597494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* --------------------------------------------------------------------- */
607494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
617494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Normally we strip MPL_LOGV (VERBOSE messages) from release builds.
637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * You can modify this (for example with "#define MPL_LOG_NDEBUG 0"
647494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * at the top of your source file) to change that behavior.
657494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
667494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOG_NDEBUG
677494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef NDEBUG
687494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_NDEBUG 1
697494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
707494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_NDEBUG 0
717494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
727494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
737494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
747494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __KERNEL__
757494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_UNKNOWN MPL_LOG_VERBOSE
767494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_DEFAULT KERN_DEFAULT
777494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_VERBOSE KERN_CONT
787494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_DEBUG   KERN_NOTICE
797494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_INFO    KERN_INFO
807494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_WARN    KERN_WARNING
817494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_ERROR   KERN_ERR
827494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_SILENT  MPL_LOG_VERBOSE
837494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
847494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
857494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	/* Based off the log priorities in android
867494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	   /system/core/include/android/log.h */
877494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_UNKNOWN		(0)
887494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_DEFAULT		(1)
897494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_VERBOSE		(2)
907494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_DEBUG		(3)
917494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_INFO		(4)
927494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_WARN		(5)
937494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_ERROR		(6)
947494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_SILENT		(8)
957494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
967494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
977494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
987494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
997494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * This is the local tag used for the following simplified
1007494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * logging macros.  You can change this preprocessor definition
1017494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * before using the other macros to change the tag.
1027494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1037494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOG_TAG
1047494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __KERNEL__
1057494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_TAG
1067494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1077494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_TAG NULL
1087494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1097494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* --------------------------------------------------------------------- */
1127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
1147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Simplified macro to send a verbose log message using the current MPL_LOG_TAG.
1157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGV
1177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#if MPL_LOG_NDEBUG
1187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef _WIN32
1197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGV(fmt, ...)						\
1207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	do {								\
1217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        __pragma (warning(suppress : 4127 )) \
1227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		if (0)							\
1237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall			MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
1247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall            __pragma (warning(suppress : 4127 )) \
1257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    } while (0)
1267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGV(fmt, ...)						\
1287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	do {								\
1297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		if (0)							\
1307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall			MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
1317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    } while (0)
1327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGV(fmt, ...) MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
1367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef CONDITION
1407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define CONDITION(cond)     ((cond) != 0)
1417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGV_IF
1447494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#if MPL_LOG_NDEBUG
1457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGV_IF(cond, fmt, ...)  \
1467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	do { if (0) MPL_LOG(fmt, ##__VA_ARGS__); } while (0)
1477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1487494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGV_IF(cond, fmt, ...) \
1497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))						\
1507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \
1517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
1527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1547494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1557494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
1567494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Simplified macro to send a debug log message using the current MPL_LOG_TAG.
1577494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1587494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGD
1597494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGD(fmt, ...) MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
1607494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1617494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGD_IF
1637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGD_IF(cond, fmt, ...) \
1647494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))					       \
1657494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
1667494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
1677494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1687494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1697494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
1707494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Simplified macro to send an info log message using the current MPL_LOG_TAG.
1717494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1727494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGI
1737494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __KERNEL__
1747494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGI(fmt, ...) pr_info(KERN_INFO MPL_LOG_TAG fmt, ##__VA_ARGS__)
1757494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1767494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGI(fmt, ...) MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
1777494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1787494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1797494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1807494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGI_IF
1817494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGI_IF(cond, fmt, ...) \
1827494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))                                              \
1837494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
1847494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
1857494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1867494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1877494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
1887494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Simplified macro to send a warning log message using the current MPL_LOG_TAG.
1897494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1907494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGW
1917494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __KERNEL__
1927494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGW(fmt, ...) printk(KERN_WARNING MPL_LOG_TAG fmt, ##__VA_ARGS__)
1937494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1947494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGW(fmt, ...) MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
1957494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1967494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1977494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1987494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGW_IF
1997494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGW_IF(cond, fmt, ...) \
2007494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))					       \
2017494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
2027494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
2037494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2047494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2057494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2067494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Simplified macro to send an error log message using the current MPL_LOG_TAG.
2077494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2087494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGE
2097494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __KERNEL__
2107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGE(fmt, ...) printk(KERN_ERR MPL_LOG_TAG fmt, ##__VA_ARGS__)
2117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
2127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGE(fmt, ...) MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
2137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGE_IF
2177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGE_IF(cond, fmt, ...) \
2187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))					       \
2197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
2207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
2217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* --------------------------------------------------------------------- */
2247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Log a fatal error.  If the given condition fails, this stops program
2277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * execution like a normal assertion, but also generating the given message.
2287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * It is NOT stripped from release builds.  Note that the condition test
2297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * is -inverted- from the normal assert() semantics.
2307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ...) \
2327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))					   \
2337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? ((void)android_printAssert(#cond, MPL_LOG_TAG,   \
2347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall						fmt, ##__VA_ARGS__))	\
2357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
2367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_ALWAYS_FATAL(fmt, ...) \
2387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	(((void)android_printAssert(NULL, MPL_LOG_TAG, fmt, ##__VA_ARGS__)))
2397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Versions of MPL_LOG_ALWAYS_FATAL_IF and MPL_LOG_ALWAYS_FATAL that
2427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * are stripped out of release builds.
2437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2447494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#if MPL_LOG_NDEBUG
2457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_FATAL_IF(cond, fmt, ...)				\
2467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	do {								\
2477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		if (0)							\
2487494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall			MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__); \
2497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	} while (0)
2507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_FATAL(fmt, ...)						\
2517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	do {								\
2527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		if (0)							\
2537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall			MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)	\
2547494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	} while (0)
2557494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
2567494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_FATAL_IF(cond, fmt, ...) \
2577494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__)
2587494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_FATAL(fmt, ...) \
2597494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)
2607494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2617494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Assertion that generates a log message when the assertion fails.
2647494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Stripped out of release builds.  Uses the current MPL_LOG_TAG.
2657494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2667494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_ASSERT(cond, fmt, ...)			\
2677494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	MPL_LOG_FATAL_IF(!(cond), fmt, ##__VA_ARGS__)
2687494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2697494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* --------------------------------------------------------------------- */
2707494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2717494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2727494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Basic log message macro.
2737494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
2747494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Example:
2757494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  MPL_LOG(MPL_LOG_WARN, NULL, "Failed with error %d", errno);
2767494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
2777494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * The second argument may be NULL or "" to indicate the "global" tag.
2787494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2797494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOG
2807494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG(priority, tag, fmt, ...)		\
2817494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	MPL_LOG_PRI(priority, tag, fmt, ##__VA_ARGS__)
2827494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2837494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2847494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2857494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Log macro that allows you to specify a number for the priority.
2867494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2877494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOG_PRI
2887494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef ANDROID
2897494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_PRI(priority, tag, fmt, ...) \
2907494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	LOG(priority, tag, fmt, ##__VA_ARGS__)
2917494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#elif defined __KERNEL__
2927494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_PRI(priority, tag, fmt, ...) \
2937494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	pr_debug(MPL_##priority tag fmt, ##__VA_ARGS__)
2947494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
2957494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_PRI(priority, tag, fmt, ...) \
2967494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	_MLPrintLog(MPL_##priority, tag, fmt, ##__VA_ARGS__)
2977494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2987494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2997494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3007494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
3017494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Log macro that allows you to pass in a varargs ("args" is a va_list).
3027494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
3037494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOG_PRI_VA
3047494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef ANDROID
3057494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
3067494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	android_vprintLog(priority, NULL, tag, fmt, args)
3077494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#elif defined __KERNEL__
3087494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* not allowed in the Kernel because there is no dev_dbg that takes a va_list */
3097494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
3107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
3117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	_MLPrintVaLog(priority, NULL, tag, fmt, args)
3127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
3137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
3147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* --------------------------------------------------------------------- */
3167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
3187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * ===========================================================================
3197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
3207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * The stuff in the rest of this file should not be used directly.
3217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
3227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef ANDROID
3247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallint _MLPrintLog(int priority, const char *tag, const char *fmt,	...);
3257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallint _MLPrintVaLog(int priority, const char *tag, const char *fmt, va_list args);
3267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* Final implementation of actual writing to a character device */
3277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallint _MLWriteLog(const char *buf, int buflen);
3287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
3297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallstatic inline void __print_result_location(int result,
3317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall					   const char *file,
3327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall					   const char *func, int line)
3337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{
3347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	MPL_LOGE("%s|%s|%d returning %d\n", file, func, line, result);
3357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
3367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef _WIN32
3387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* The pragma removes warning about expression being constant */
3397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define LOG_RESULT_LOCATION(condition) \
3407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    do {								\
3417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		__print_result_location((int)(condition), __FILE__,	\
3427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall					__func__, __LINE__);		\
3437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        __pragma (warning(suppress : 4127 )) \
3447494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	} while (0)
3457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
3467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define LOG_RESULT_LOCATION(condition) \
3477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    do {								\
3487494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		__print_result_location((int)(condition), __FILE__,	\
3497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall					__func__, __LINE__);		\
3507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	} while (0)
3517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
3527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3547494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define INV_ERROR_CHECK(r_1329) \
3557494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if (r_1329) { \
3567494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        LOG_RESULT_LOCATION(r_1329); \
3577494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        return r_1329; \
3587494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
3597494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3607494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __cplusplus
3617494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
3627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
3637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif				/* _LIBS_CUTILS_MPL_LOG_H */
364