Home | History | Annotate | Download | only in utils
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef LOG_H_
     18 #define LOG_H_
     19 
     20 #include <android/log.h>
     21 
     22 #ifdef __cplusplus
     23 extern "C" {
     24 #endif
     25 
     26 // ---------------------------------------------------------------------
     27 
     28 /*
     29  * Normally we strip ALOGV (VERBOSE messages) from release builds.
     30  * You can modify this (for example with "#define LOG_NDEBUG 0"
     31  * at the top of your source file) to change that behavior.
     32  */
     33 #ifndef LOG_NDEBUG
     34 #ifdef NDEBUG
     35 #define LOG_NDEBUG 1
     36 #else
     37 #define LOG_NDEBUG 0
     38 #endif
     39 #endif
     40 
     41 /*
     42  * This is the local tag used for the following simplified
     43  * logging macros.  You can change this preprocessor definition
     44  * before using the other macros to change the tag.
     45  */
     46 #ifndef LOG_TAG
     47 #define LOG_TAG "RasterMill"
     48 #endif
     49 
     50 // ---------------------------------------------------------------------
     51 
     52 /*
     53  * Simplified macro to send a verbose log message using the current LOG_TAG.
     54  */
     55 #ifndef ALOGV
     56 #if LOG_NDEBUG
     57 #define ALOGV(...)   ((void)0)
     58 #else
     59 #define ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
     60 #endif
     61 #endif
     62 
     63 #define CONDITION(cond)     (__builtin_expect((cond)!=0, 0))
     64 
     65 #ifndef ALOGV_IF
     66 #if LOG_NDEBUG
     67 #define ALOGV_IF(cond, ...)   ((void)0)
     68 #else
     69 #define ALOGV_IF(cond, ...) \
     70     ( (CONDITION(cond)) \
     71     ? ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
     72     : (void)0 )
     73 #endif
     74 #endif
     75 
     76 /*
     77  * Simplified macro to send a debug log message using the current LOG_TAG.
     78  */
     79 #ifndef ALOGD
     80 #define ALOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
     81 #endif
     82 
     83 #ifndef ALOGD_IF
     84 #define ALOGD_IF(cond, ...) \
     85     ( (CONDITION(cond)) \
     86     ? ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
     87     : (void)0 )
     88 #endif
     89 
     90 /*
     91  * Simplified macro to send an info log message using the current LOG_TAG.
     92  */
     93 #ifndef ALOGI
     94 #define ALOGI(...) ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__))
     95 #endif
     96 
     97 #ifndef ALOGI_IF
     98 #define ALOGI_IF(cond, ...) \
     99     ( (CONDITION(cond)) \
    100     ? ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) \
    101     : (void)0 )
    102 #endif
    103 
    104 /*
    105  * Simplified macro to send a warning log message using the current LOG_TAG.
    106  */
    107 #ifndef ALOGW
    108 #define ALOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
    109 #endif
    110 
    111 #ifndef ALOGW_IF
    112 #define ALOGW_IF(cond, ...) \
    113     ( (CONDITION(cond)) \
    114     ? ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) \
    115     : (void)0 )
    116 #endif
    117 
    118 /*
    119  * Simplified macro to send an error log message using the current LOG_TAG.
    120  */
    121 #ifndef ALOGE
    122 #define ALOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
    123 #endif
    124 
    125 #ifndef ALOGE_IF
    126 #define ALOGE_IF(cond, ...) \
    127     ( (CONDITION(cond)) \
    128     ? ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
    129     : (void)0 )
    130 #endif
    131 
    132 // ---------------------------------------------------------------------
    133 
    134 /*
    135  * Conditional based on whether the current LOG_TAG is enabled at
    136  * verbose priority.
    137  */
    138 #ifndef IF_ALOGV
    139 #if LOG_NDEBUG
    140 #define IF_ALOGV() if (false)
    141 #else
    142 #define IF_ALOGV() IF_ALOG(LOG_VERBOSE, LOG_TAG)
    143 #endif
    144 #endif
    145 
    146 /*
    147  * Conditional based on whether the current LOG_TAG is enabled at
    148  * debug priority.
    149  */
    150 #ifndef IF_ALOGD
    151 #define IF_ALOGD() IF_ALOG(LOG_DEBUG, LOG_TAG)
    152 #endif
    153 
    154 /*
    155  * Conditional based on whether the current LOG_TAG is enabled at
    156  * info priority.
    157  */
    158 #ifndef IF_ALOGI
    159 #define IF_ALOGI() IF_ALOG(LOG_INFO, LOG_TAG)
    160 #endif
    161 
    162 /*
    163  * Conditional based on whether the current LOG_TAG is enabled at
    164  * warn priority.
    165  */
    166 #ifndef IF_ALOGW
    167 #define IF_ALOGW() IF_ALOG(LOG_WARN, LOG_TAG)
    168 #endif
    169 
    170 /*
    171  * Conditional based on whether the current LOG_TAG is enabled at
    172  * error priority.
    173  */
    174 #ifndef IF_ALOGE
    175 #define IF_ALOGE() IF_ALOG(LOG_ERROR, LOG_TAG)
    176 #endif
    177 
    178 // ---------------------------------------------------------------------
    179 
    180 /*
    181  * Log a fatal error.  If the given condition fails, this stops program
    182  * execution like a normal assertion, but also generating the given message.
    183  * It is NOT stripped from release builds.  Note that the condition test
    184  * is -inverted- from the normal assert() semantics.
    185  */
    186 #ifndef LOG_ALWAYS_FATAL_IF
    187 #define LOG_ALWAYS_FATAL_IF(cond, ...) \
    188     ( (CONDITION(cond)) \
    189     ? ((void)android_printAssert(#cond, LOG_TAG, ## __VA_ARGS__)) \
    190     : (void)0 )
    191 #endif
    192 
    193 #ifndef LOG_ALWAYS_FATAL
    194 #define LOG_ALWAYS_FATAL(...) \
    195     ( ((void)android_printAssert(NULL, LOG_TAG, ## __VA_ARGS__)) )
    196 #endif
    197 
    198 /*
    199  * Versions of LOG_ALWAYS_FATAL_IF and LOG_ALWAYS_FATAL that
    200  * are stripped out of release builds.
    201  */
    202 #if LOG_NDEBUG
    203 
    204 #ifndef LOG_FATAL_IF
    205 #define LOG_FATAL_IF(cond, ...) ((void)0)
    206 #endif
    207 #ifndef LOG_FATAL
    208 #define LOG_FATAL(...) ((void)0)
    209 #endif
    210 
    211 #else
    212 
    213 #ifndef LOG_FATAL_IF
    214 #define LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ## __VA_ARGS__)
    215 #endif
    216 #ifndef LOG_FATAL
    217 #define LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__)
    218 #endif
    219 
    220 #endif
    221 
    222 /*
    223  * Assertion that generates a log message when the assertion fails.
    224  * Stripped out of release builds.  Uses the current LOG_TAG.
    225  */
    226 #ifndef ALOG_ASSERT
    227 #define ALOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ## __VA_ARGS__)
    228 //#define ALOG_ASSERT(cond) LOG_FATAL_IF(!(cond), "Assertion failed: " #cond)
    229 #endif
    230 
    231 // ---------------------------------------------------------------------
    232 
    233 /*
    234  * Basic log message macro.
    235  *
    236  * Example:
    237  *  ALOG(LOG_WARN, NULL, "Failed with error %d", errno);
    238  *
    239  * The second argument may be NULL or "" to indicate the "global" tag.
    240  */
    241 #ifndef ALOG
    242 #define ALOG(priority, tag, ...) \
    243     LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
    244 #endif
    245 
    246 /*
    247  * Log macro that allows you to specify a number for the priority.
    248  */
    249 #ifndef LOG_PRI
    250 #define LOG_PRI(priority, tag, ...) \
    251     __android_log_print(priority, tag, __VA_ARGS__)
    252 #endif
    253 
    254 /*
    255  * Log macro that allows you to pass in a varargs ("args" is a va_list).
    256  */
    257 #ifndef LOG_PRI_VA
    258 #define LOG_PRI_VA(priority, tag, fmt, args) \
    259     __android_log_vprint(priority, NULL, tag, fmt, args)
    260 #endif
    261 
    262 /*
    263  * Conditional given a desired logging priority and tag.
    264  */
    265 #ifndef IF_ALOG
    266 #define IF_ALOG(priority, tag) \
    267     if (__android_log_assert(ANDROID_##priority, tag))
    268 #endif
    269 
    270 /* Returns 2nd arg.  Used to substitute default value if caller's vararg list
    271  * is empty.
    272  */
    273 #define __android_second(dummy, second, ...)     second
    274 
    275 /* If passed multiple args, returns ',' followed by all but 1st arg, otherwise
    276  * returns nothing.
    277  */
    278 #define __android_rest(first, ...)               , ## __VA_ARGS__
    279 
    280 #define android_printAssert(cond, tag, fmt...) \
    281     __android_log_assert(cond, tag, \
    282         __android_second(0, ## fmt, NULL) __android_rest(fmt))
    283 
    284 #ifdef __cplusplus
    285 }
    286 #endif
    287 
    288 #endif /* LOG_H_ */
    289