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