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
408504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall#include <stdlib.h>
417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include <stdarg.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
598504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall
607494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* --------------------------------------------------------------------- */
617494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Normally we strip MPL_LOGV (VERBOSE messages) from release builds.
647494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * You can modify this (for example with "#define MPL_LOG_NDEBUG 0"
657494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * at the top of your source file) to change that behavior.
667494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
677494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOG_NDEBUG
687494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef NDEBUG
697494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_NDEBUG 1
707494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
717494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_NDEBUG 0
727494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
737494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
747494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
757494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __KERNEL__
767494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_UNKNOWN MPL_LOG_VERBOSE
777494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_DEFAULT KERN_DEFAULT
787494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_VERBOSE KERN_CONT
797494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_DEBUG   KERN_NOTICE
807494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_INFO    KERN_INFO
817494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_WARN    KERN_WARNING
827494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_ERROR   KERN_ERR
837494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_SILENT  MPL_LOG_VERBOSE
847494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
857494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
867494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	/* Based off the log priorities in android
877494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	   /system/core/include/android/log.h */
887494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_UNKNOWN		(0)
897494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_DEFAULT		(1)
907494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_VERBOSE		(2)
917494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_DEBUG		(3)
927494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_INFO		(4)
937494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_WARN		(5)
947494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_ERROR		(6)
957494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_SILENT		(8)
967494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
977494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
987494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
997494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
1007494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * This is the local tag used for the following simplified
1017494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * logging macros.  You can change this preprocessor definition
1027494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * before using the other macros to change the tag.
1037494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1047494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOG_TAG
1057494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __KERNEL__
1067494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_TAG
1077494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1087494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_TAG NULL
1097494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* --------------------------------------------------------------------- */
1137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
1157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Simplified macro to send a verbose log message using the current MPL_LOG_TAG.
1167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGV
1187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#if MPL_LOG_NDEBUG
1197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef _WIN32
1207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGV(fmt, ...)						\
1217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	do {								\
1227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        __pragma (warning(suppress : 4127 )) \
1237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		if (0)							\
1247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall			MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
1257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall            __pragma (warning(suppress : 4127 )) \
1267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    } while (0)
1277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGV(fmt, ...)						\
1297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	do {								\
1307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		if (0)							\
1317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall			MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
1327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    } while (0)
1337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGV(fmt, ...) MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
1377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef CONDITION
1417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define CONDITION(cond)     ((cond) != 0)
1427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1447494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGV_IF
1457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#if MPL_LOG_NDEBUG
1467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGV_IF(cond, fmt, ...)  \
1477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	do { if (0) MPL_LOG(fmt, ##__VA_ARGS__); } while (0)
1487494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGV_IF(cond, fmt, ...) \
1507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))						\
1517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \
1527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
1537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1547494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1557494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1567494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
1577494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Simplified macro to send a debug log message using the current MPL_LOG_TAG.
1587494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1597494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGD
1607494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGD(fmt, ...) MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
1617494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGD_IF
1647494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGD_IF(cond, fmt, ...) \
1657494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))					       \
1667494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
1677494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
1687494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1697494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1707494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
1717494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Simplified macro to send an info log message using the current MPL_LOG_TAG.
1727494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1737494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGI
1747494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __KERNEL__
1757494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGI(fmt, ...) pr_info(KERN_INFO MPL_LOG_TAG fmt, ##__VA_ARGS__)
1767494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1777494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGI(fmt, ...) MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
1787494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1797494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1807494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1817494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGI_IF
1827494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGI_IF(cond, fmt, ...) \
1837494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))                                              \
1847494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
1857494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
1867494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1877494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1887494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
1897494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Simplified macro to send a warning log message using the current MPL_LOG_TAG.
1907494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1917494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGW
1927494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __KERNEL__
1937494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGW(fmt, ...) printk(KERN_WARNING MPL_LOG_TAG fmt, ##__VA_ARGS__)
1947494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
1957494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGW(fmt, ...) MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
1967494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1977494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
1987494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1997494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGW_IF
2007494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGW_IF(cond, fmt, ...) \
2017494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))					       \
2027494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
2037494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
2047494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2057494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2067494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2077494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Simplified macro to send an error log message using the current MPL_LOG_TAG.
2087494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2097494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGE
2107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __KERNEL__
2117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGE(fmt, ...) printk(KERN_ERR MPL_LOG_TAG fmt, ##__VA_ARGS__)
2127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
2137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGE(fmt, ...) MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
2147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOGE_IF
2187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOGE_IF(cond, fmt, ...) \
2197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))					       \
2207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
2217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
2227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* --------------------------------------------------------------------- */
2257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Log a fatal error.  If the given condition fails, this stops program
2287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * execution like a normal assertion, but also generating the given message.
2297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * It is NOT stripped from release builds.  Note that the condition test
2307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * is -inverted- from the normal assert() semantics.
2317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ...) \
2337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	((CONDITION(cond))					   \
2347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		? ((void)android_printAssert(#cond, MPL_LOG_TAG,   \
2357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall						fmt, ##__VA_ARGS__))	\
2367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		: (void)0)
2377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_ALWAYS_FATAL(fmt, ...) \
2397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	(((void)android_printAssert(NULL, MPL_LOG_TAG, fmt, ##__VA_ARGS__)))
2407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Versions of MPL_LOG_ALWAYS_FATAL_IF and MPL_LOG_ALWAYS_FATAL that
2437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * are stripped out of release builds.
2447494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#if MPL_LOG_NDEBUG
2467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_FATAL_IF(cond, fmt, ...)				\
2477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	do {								\
2487494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		if (0)							\
2497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall			MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__); \
2507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	} while (0)
2517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_FATAL(fmt, ...)						\
2527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	do {								\
2537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		if (0)							\
2547494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall			MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)	\
2557494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	} while (0)
2567494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
2577494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_FATAL_IF(cond, fmt, ...) \
2587494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__)
2597494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_FATAL(fmt, ...) \
2607494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)
2617494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2647494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Assertion that generates a log message when the assertion fails.
2657494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Stripped out of release builds.  Uses the current MPL_LOG_TAG.
2667494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2677494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_ASSERT(cond, fmt, ...)			\
2687494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	MPL_LOG_FATAL_IF(!(cond), fmt, ##__VA_ARGS__)
2697494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2707494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* --------------------------------------------------------------------- */
2717494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2727494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2737494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Basic log message macro.
2747494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
2757494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Example:
2767494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  MPL_LOG(MPL_LOG_WARN, NULL, "Failed with error %d", errno);
2777494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
2787494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * The second argument may be NULL or "" to indicate the "global" tag.
2797494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2807494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOG
2817494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG(priority, tag, fmt, ...)		\
2827494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	MPL_LOG_PRI(priority, tag, fmt, ##__VA_ARGS__)
2837494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2847494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2857494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
2867494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Log macro that allows you to specify a number for the priority.
2877494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2887494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOG_PRI
2897494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef ANDROID
2907494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_PRI(priority, tag, fmt, ...) \
2918504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall	ALOG(priority, tag, fmt, ##__VA_ARGS__)
2927494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#elif defined __KERNEL__
2937494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_PRI(priority, tag, fmt, ...) \
2947494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	pr_debug(MPL_##priority tag fmt, ##__VA_ARGS__)
2957494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
2967494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_PRI(priority, tag, fmt, ...) \
2977494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	_MLPrintLog(MPL_##priority, tag, fmt, ##__VA_ARGS__)
2987494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
2997494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
3007494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3017494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
3027494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * Log macro that allows you to pass in a varargs ("args" is a va_list).
3037494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
3047494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef MPL_LOG_PRI_VA
3057494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef ANDROID
3067494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
3077494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	android_vprintLog(priority, NULL, tag, fmt, args)
3087494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#elif defined __KERNEL__
3097494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* not allowed in the Kernel because there is no dev_dbg that takes a va_list */
3107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
3117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
3127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	_MLPrintVaLog(priority, NULL, tag, fmt, args)
3137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
3147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
3157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* --------------------------------------------------------------------- */
3177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
3197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * ===========================================================================
3207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
3217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * The stuff in the rest of this file should not be used directly.
3227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
3237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifndef ANDROID
3257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallint _MLPrintLog(int priority, const char *tag, const char *fmt,	...);
3267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallint _MLPrintVaLog(int priority, const char *tag, const char *fmt, va_list args);
3277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* Final implementation of actual writing to a character device */
3287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallint _MLWriteLog(const char *buf, int buflen);
3297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
3307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallstatic inline void __print_result_location(int result,
3327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall					   const char *file,
3337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall					   const char *func, int line)
3347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{
3357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	MPL_LOGE("%s|%s|%d returning %d\n", file, func, line, result);
3367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
3377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef _WIN32
3397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/* The pragma removes warning about expression being constant */
3407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define LOG_RESULT_LOCATION(condition) \
3417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    do {								\
3427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		__print_result_location((int)(condition), __FILE__,	\
3437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall					__func__, __LINE__);		\
3447494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        __pragma (warning(suppress : 4127 )) \
3457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	} while (0)
3467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#else
3477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define LOG_RESULT_LOCATION(condition) \
3487494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    do {								\
3497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall		__print_result_location((int)(condition), __FILE__,	\
3507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall					__func__, __LINE__);		\
3517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall	} while (0)
3527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
3537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3547494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3557494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define INV_ERROR_CHECK(r_1329) \
35633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    if (r_1329) { \
35733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        LOG_RESULT_LOCATION(r_1329); \
35833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        return r_1329; \
3597494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
3607494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3617494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#ifdef __cplusplus
3627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
3637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif
3647494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#endif				/* _LIBS_CUTILS_MPL_LOG_H */
365