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