1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Copyright (C) 2005 The Android Open Source Project
3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * you may not use this file except in compliance with the License.
6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * You may obtain a copy of the License at
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *
8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * See the License for the specific language governing permissions and
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * limitations under the License.
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)//
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// C/C++ logging functions.  See the logging documentation for API details.
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)//
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// We'd like these to be available from C code (in case we import some from
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// somewhere), so this has a C interface.
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)//
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// The output will be correct when the log file is shared between multiple
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// threads and/or multiple processes so long as the operating system
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// supports O_APPEND.  These calls have mutex-protected data structures
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// and so are NOT reentrant.  Do not use LOG in a signal handler.
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)//
28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef _LIBS_LOG_LOG_H
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define _LIBS_LOG_LOG_H
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <stdio.h>
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <time.h>
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <sys/types.h>
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <unistd.h>
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifdef HAVE_PTHREADS
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <pthread.h>
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <stdarg.h>
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifdef ANDROID
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <log/uio.h>
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <log/logd.h>
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <android/log.h>
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifdef __cplusplus
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)extern "C" {
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ---------------------------------------------------------------------
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Normally we strip ALOGV (VERBOSE messages) from release builds.
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * You can modify this (for example with "#define LOG_NDEBUG 0"
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * at the top of your source file) to change that behavior.
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_NDEBUG
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifdef NDEBUG
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_NDEBUG 1
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_NDEBUG 0
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * This is the local tag used for the following simplified
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * logging macros.  You can change this preprocessor definition
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * before using the other macros to change the tag.
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_TAG
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_TAG NULL
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ---------------------------------------------------------------------
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send a verbose log message using the current LOG_TAG.
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOGV
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if LOG_NDEBUG
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGV(...)   ((void)0)
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define CONDITION(cond)     (__builtin_expect((cond)!=0, 0))
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOGV_IF
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if LOG_NDEBUG
92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGV_IF(cond, ...)   ((void)0)
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGV_IF(cond, ...) \
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send a debug log message using the current LOG_TAG.
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOGD
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOGD_IF
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGD_IF(cond, ...) \
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send an info log message using the current LOG_TAG.
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOGI
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGI(...) ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__))
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOGI_IF
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGI_IF(cond, ...) \
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) \
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send a warning log message using the current LOG_TAG.
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOGW
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOGW_IF
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGW_IF(cond, ...) \
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) \
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send an error log message using the current LOG_TAG.
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOGE
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOGE_IF
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOGE_IF(cond, ...) \
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ---------------------------------------------------------------------
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Conditional based on whether the current LOG_TAG is enabled at
161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * verbose priority.
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef IF_ALOGV
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if LOG_NDEBUG
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define IF_ALOGV() if (false)
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define IF_ALOGV() IF_ALOG(LOG_VERBOSE, LOG_TAG)
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Conditional based on whether the current LOG_TAG is enabled at
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * debug priority.
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef IF_ALOGD
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define IF_ALOGD() IF_ALOG(LOG_DEBUG, LOG_TAG)
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Conditional based on whether the current LOG_TAG is enabled at
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * info priority.
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef IF_ALOGI
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define IF_ALOGI() IF_ALOG(LOG_INFO, LOG_TAG)
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Conditional based on whether the current LOG_TAG is enabled at
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * warn priority.
190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef IF_ALOGW
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define IF_ALOGW() IF_ALOG(LOG_WARN, LOG_TAG)
193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Conditional based on whether the current LOG_TAG is enabled at
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * error priority.
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef IF_ALOGE
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define IF_ALOGE() IF_ALOG(LOG_ERROR, LOG_TAG)
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ---------------------------------------------------------------------
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send a verbose system log message using the current LOG_TAG.
208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef SLOGV
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if LOG_NDEBUG
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGV(...)   ((void)0)
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGV(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define CONDITION(cond)     (__builtin_expect((cond)!=0, 0))
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef SLOGV_IF
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if LOG_NDEBUG
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGV_IF(cond, ...)   ((void)0)
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGV_IF(cond, ...) \
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
228010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
229010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send a debug system log message using the current LOG_TAG.
232010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
233010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef SLOGD
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGD(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
235010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
236010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
237010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef SLOGD_IF
238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGD_IF(cond, ...) \
239010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
241010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
242010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
243010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send an info system log message using the current LOG_TAG.
246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef SLOGI
248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGI(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))
249010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef SLOGI_IF
252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGI_IF(cond, ...) \
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) \
255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send a warning system log message using the current LOG_TAG.
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef SLOGW
262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGW(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__))
263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
265010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef SLOGW_IF
266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGW_IF(cond, ...) \
267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) \
269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send an error system log message using the current LOG_TAG.
274010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef SLOGE
276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGE(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))
277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef SLOGE_IF
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define SLOGE_IF(cond, ...) \
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
285010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ---------------------------------------------------------------------
287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send a verbose radio log message using the current LOG_TAG.
290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef RLOGV
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if LOG_NDEBUG
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGV(...)   ((void)0)
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGV(...) ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define CONDITION(cond)     (__builtin_expect((cond)!=0, 0))
300010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
301010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef RLOGV_IF
302010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if LOG_NDEBUG
303010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGV_IF(cond, ...)   ((void)0)
304010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGV_IF(cond, ...) \
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
313010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send a debug radio log message using the current LOG_TAG.
314010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
315010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef RLOGD
316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGD(...) ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef RLOGD_IF
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGD_IF(cond, ...) \
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send an info radio log message using the current LOG_TAG.
328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef RLOGI
330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGI(...) ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
333010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef RLOGI_IF
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGI_IF(cond, ...) \
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
336010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) \
337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send a warning radio log message using the current LOG_TAG.
342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef RLOGW
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGW(...) ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__))
345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef RLOGW_IF
348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGW_IF(cond, ...) \
349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) \
351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
352010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
353010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
354010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
355010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Simplified macro to send an error radio log message using the current LOG_TAG.
356010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
357010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef RLOGE
358010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGE(...) ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))
359010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
361010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef RLOGE_IF
362010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define RLOGE_IF(cond, ...) \
363010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
364010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)__android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
365010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
366010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
367010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
368010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
369010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ---------------------------------------------------------------------
370010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Log a fatal error.  If the given condition fails, this stops program
373010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * execution like a normal assertion, but also generating the given message.
374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * It is NOT stripped from release builds.  Note that the condition test
375010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * is -inverted- from the normal assert() semantics.
376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_ALWAYS_FATAL_IF
378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_ALWAYS_FATAL_IF(cond, ...) \
379010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( (CONDITION(cond)) \
380010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ? ((void)android_printAssert(#cond, LOG_TAG, ## __VA_ARGS__)) \
381010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : (void)0 )
382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_ALWAYS_FATAL
385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_ALWAYS_FATAL(...) \
386010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ( ((void)android_printAssert(NULL, LOG_TAG, ## __VA_ARGS__)) )
387010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
389010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Versions of LOG_ALWAYS_FATAL_IF and LOG_ALWAYS_FATAL that
391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * are stripped out of release builds.
392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
393010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if LOG_NDEBUG
394010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
395010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_FATAL_IF
396010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_FATAL_IF(cond, ...) ((void)0)
397010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
398010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_FATAL
399010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_FATAL(...) ((void)0)
400010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
401010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
402010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else
403010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
404010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_FATAL_IF
405010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ## __VA_ARGS__)
406010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_FATAL
408010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__)
409010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
411010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
412010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Assertion that generates a log message when the assertion fails.
415010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Stripped out of release builds.  Uses the current LOG_TAG.
416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOG_ASSERT
418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ## __VA_ARGS__)
419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)//#define ALOG_ASSERT(cond) LOG_FATAL_IF(!(cond), "Assertion failed: " #cond)
420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ---------------------------------------------------------------------
423010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Basic log message macro.
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Example:
428010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *  ALOG(LOG_WARN, NULL, "Failed with error %d", errno);
429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *
430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * The second argument may be NULL or "" to indicate the "global" tag.
431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef ALOG
433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define ALOG(priority, tag, ...) \
434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Log macro that allows you to specify a number for the priority.
439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_PRI
441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_PRI(priority, tag, ...) \
442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    android_printLog(priority, tag, __VA_ARGS__)
443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Log macro that allows you to pass in a varargs ("args" is a va_list).
447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_PRI_VA
449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_PRI_VA(priority, tag, fmt, args) \
450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    android_vprintLog(priority, NULL, tag, fmt, args)
451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Conditional given a desired logging priority and tag.
455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef IF_ALOG
457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define IF_ALOG(priority, tag) \
458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (android_testLog(ANDROID_##priority, tag))
459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
460010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// ---------------------------------------------------------------------
462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Event logging.
465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
468010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Event log entry types.  These must match up with the declarations in
469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * java/android/android/util/EventLog.java.
470010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
471010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)typedef enum {
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EVENT_TYPE_INT      = 0,
473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EVENT_TYPE_LONG     = 1,
474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EVENT_TYPE_STRING   = 2,
475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EVENT_TYPE_LIST     = 3,
476010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} AndroidEventLogType;
477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
478010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_EVENT_INT
480010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_EVENT_INT(_tag, _value) {                                       \
481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        int intBuf = _value;                                                \
482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        (void) android_btWriteLog(_tag, EVENT_TYPE_INT, &intBuf,            \
483010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            sizeof(intBuf));                                                \
484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
485010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_EVENT_LONG
487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_EVENT_LONG(_tag, _value) {                                      \
488010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        long long longBuf = _value;                                         \
489010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        (void) android_btWriteLog(_tag, EVENT_TYPE_LONG, &longBuf,          \
490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            sizeof(longBuf));                                               \
491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifndef LOG_EVENT_STRING
494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define LOG_EVENT_STRING(_tag, _value)                                      \
495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ((void) 0)  /* not implemented -- must combine len with string */
496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/* TODO: something for LIST */
498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
500010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * ===========================================================================
501010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) *
502010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * The stuff in the rest of this file should not be used directly.
503010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
504010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
505010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_printLog(prio, tag, fmt...) \
506010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    __android_log_print(prio, tag, fmt)
507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
508010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_vprintLog(prio, cond, tag, fmt...) \
509010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    __android_log_vprint(prio, tag, fmt)
510010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
511010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/* XXX Macros to work around syntax errors in places where format string
512010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * arg is not passed to ALOG_ASSERT, LOG_ALWAYS_FATAL or LOG_ALWAYS_FATAL_IF
513010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * (happens only in debug builds).
514010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
515010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
516010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/* Returns 2nd arg.  Used to substitute default value if caller's vararg list
517010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * is empty.
518010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define __android_second(dummy, second, ...)     second
520010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
521010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/* If passed multiple args, returns ',' followed by all but 1st arg, otherwise
522010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * returns nothing.
523010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define __android_rest(first, ...)               , ## __VA_ARGS__
525010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_printAssert(cond, tag, fmt...) \
527010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    __android_log_assert(cond, tag, \
528010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        __android_second(0, ## fmt, NULL) __android_rest(fmt))
529010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
530010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_writeLog(prio, tag, text) \
531010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    __android_log_write(prio, tag, text)
532010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
533010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_bWriteLog(tag, payload, len) \
534010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    __android_log_bwrite(tag, payload, len)
535010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_btWriteLog(tag, type, payload, len) \
536010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    __android_log_btwrite(tag, type, payload, len)
537010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
538010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO: remove these prototypes and their users
539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_testLog(prio, tag) (1)
540010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_writevLog(vec,num) do{}while(0)
541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_write1Log(str,len) do{}while (0)
542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_setMinPriority(tag, prio) do{}while(0)
543010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)//#define android_logToCallback(func) do{}while(0)
544010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_logToFile(tag, file) (0)
545010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define android_logToFd(tag, fd) (0)
546010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
547010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)typedef enum {
548010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LOG_ID_MAIN = 0,
549010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LOG_ID_RADIO = 1,
550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LOG_ID_EVENTS = 2,
551010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LOG_ID_SYSTEM = 3,
552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
553010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LOG_ID_MAX
554010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} log_id_t;
555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)/*
557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Send a simple string to the log.
558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */
559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int __android_log_buf_write(int bufID, int prio, const char *tag, const char *text);
560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)int __android_log_buf_print(int bufID, int prio, const char *tag, const char *fmt, ...);
561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#ifdef __cplusplus
564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif // _LIBS_CUTILS_LOG_H
568