Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/include/android_stub/log/log_main.h
4547 views
1
/*
2
* Copyright (C) 2005-2017 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
#pragma once
18
19
#include <stdbool.h>
20
#include <sys/cdefs.h>
21
#include <sys/types.h>
22
23
#include <android/log.h>
24
25
__BEGIN_DECLS
26
27
/*
28
* Normally we strip the effects of ALOGV (VERBOSE messages),
29
* LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the
30
* release builds be defining NDEBUG. You can modify this (for
31
* example with "#define LOG_NDEBUG 0" at the top of your source
32
* file) to change that behavior.
33
*/
34
35
#ifndef LOG_NDEBUG
36
#ifdef NDEBUG
37
#define LOG_NDEBUG 1
38
#else
39
#define LOG_NDEBUG 0
40
#endif
41
#endif
42
43
/* --------------------------------------------------------------------- */
44
45
/*
46
* This file uses ", ## __VA_ARGS__" zero-argument token pasting to
47
* work around issues with debug-only syntax errors in assertions
48
* that are missing format strings. See commit
49
* 19299904343daf191267564fe32e6cd5c165cd42
50
*/
51
#if defined(__clang__)
52
#pragma clang diagnostic push
53
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
54
#endif
55
56
/*
57
* Use __VA_ARGS__ if running a static analyzer,
58
* to avoid warnings of unused variables in __VA_ARGS__.
59
* Use constexpr function in C++ mode, so these macros can be used
60
* in other constexpr functions without warning.
61
*/
62
#ifdef __clang_analyzer__
63
#ifdef __cplusplus
64
extern "C++" {
65
template <typename... Ts>
66
constexpr int __fake_use_va_args(Ts...) {
67
return 0;
68
}
69
}
70
#else
71
extern int __fake_use_va_args(int, ...);
72
#endif /* __cplusplus */
73
#define __FAKE_USE_VA_ARGS(...) ((void)__fake_use_va_args(0, ##__VA_ARGS__))
74
#else
75
#define __FAKE_USE_VA_ARGS(...) ((void)(0))
76
#endif /* __clang_analyzer__ */
77
78
#ifndef __predict_false
79
#define __predict_false(exp) __builtin_expect((exp) != 0, 0)
80
#endif
81
82
#define android_writeLog(prio, tag, text) __android_log_write(prio, tag, text)
83
84
#define android_printLog(prio, tag, ...) \
85
__android_log_print(prio, tag, __VA_ARGS__)
86
87
#define android_vprintLog(prio, cond, tag, ...) \
88
__android_log_vprint(prio, tag, __VA_ARGS__)
89
90
/*
91
* Log macro that allows you to specify a number for the priority.
92
*/
93
#ifndef LOG_PRI
94
#define LOG_PRI(priority, tag, ...) android_printLog(priority, tag, __VA_ARGS__)
95
#endif
96
97
/*
98
* Log macro that allows you to pass in a varargs ("args" is a va_list).
99
*/
100
#ifndef LOG_PRI_VA
101
#define LOG_PRI_VA(priority, tag, fmt, args) \
102
android_vprintLog(priority, NULL, tag, fmt, args)
103
#endif
104
105
/* --------------------------------------------------------------------- */
106
107
/* XXX Macros to work around syntax errors in places where format string
108
* arg is not passed to ALOG_ASSERT, LOG_ALWAYS_FATAL or LOG_ALWAYS_FATAL_IF
109
* (happens only in debug builds).
110
*/
111
112
/* Returns 2nd arg. Used to substitute default value if caller's vararg list
113
* is empty.
114
*/
115
#define __android_second(dummy, second, ...) second
116
117
/* If passed multiple args, returns ',' followed by all but 1st arg, otherwise
118
* returns nothing.
119
*/
120
#define __android_rest(first, ...) , ##__VA_ARGS__
121
122
#define android_printAssert(cond, tag, ...) \
123
__android_log_assert(cond, tag, \
124
__android_second(0, ##__VA_ARGS__, NULL) \
125
__android_rest(__VA_ARGS__))
126
127
/*
128
* Log a fatal error. If the given condition fails, this stops program
129
* execution like a normal assertion, but also generating the given message.
130
* It is NOT stripped from release builds. Note that the condition test
131
* is -inverted- from the normal assert() semantics.
132
*/
133
#ifndef LOG_ALWAYS_FATAL_IF
134
#define LOG_ALWAYS_FATAL_IF(cond, ...) \
135
((__predict_false(cond)) ? (__FAKE_USE_VA_ARGS(__VA_ARGS__), \
136
((void)android_printAssert(#cond, LOG_TAG, ##__VA_ARGS__))) \
137
: ((void)0))
138
#endif
139
140
#ifndef LOG_ALWAYS_FATAL
141
#define LOG_ALWAYS_FATAL(...) \
142
(((void)android_printAssert(NULL, LOG_TAG, ##__VA_ARGS__)))
143
#endif
144
145
/*
146
* Versions of LOG_ALWAYS_FATAL_IF and LOG_ALWAYS_FATAL that
147
* are stripped out of release builds.
148
*/
149
150
#if LOG_NDEBUG
151
152
#ifndef LOG_FATAL_IF
153
#define LOG_FATAL_IF(cond, ...) __FAKE_USE_VA_ARGS(__VA_ARGS__)
154
#endif
155
#ifndef LOG_FATAL
156
#define LOG_FATAL(...) __FAKE_USE_VA_ARGS(__VA_ARGS__)
157
#endif
158
159
#else
160
161
#ifndef LOG_FATAL_IF
162
#define LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, ##__VA_ARGS__)
163
#endif
164
#ifndef LOG_FATAL
165
#define LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__)
166
#endif
167
168
#endif
169
170
/*
171
* Assertion that generates a log message when the assertion fails.
172
* Stripped out of release builds. Uses the current LOG_TAG.
173
*/
174
#ifndef ALOG_ASSERT
175
#define ALOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ##__VA_ARGS__)
176
#endif
177
178
/* --------------------------------------------------------------------- */
179
180
/*
181
* C/C++ logging functions. See the logging documentation for API details.
182
*
183
* We'd like these to be available from C code (in case we import some from
184
* somewhere), so this has a C interface.
185
*
186
* The output will be correct when the log file is shared between multiple
187
* threads and/or multiple processes so long as the operating system
188
* supports O_APPEND. These calls have mutex-protected data structures
189
* and so are NOT reentrant. Do not use LOG in a signal handler.
190
*/
191
192
/* --------------------------------------------------------------------- */
193
194
/*
195
* Simplified macro to send a verbose log message using the current LOG_TAG.
196
*/
197
#ifndef ALOGV
198
#define __ALOGV(...) ((void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
199
#if LOG_NDEBUG
200
#define ALOGV(...) \
201
do { \
202
__FAKE_USE_VA_ARGS(__VA_ARGS__); \
203
if (false) { \
204
__ALOGV(__VA_ARGS__); \
205
} \
206
} while (false)
207
#else
208
#define ALOGV(...) __ALOGV(__VA_ARGS__)
209
#endif
210
#endif
211
212
#ifndef ALOGV_IF
213
#if LOG_NDEBUG
214
#define ALOGV_IF(cond, ...) __FAKE_USE_VA_ARGS(__VA_ARGS__)
215
#else
216
#define ALOGV_IF(cond, ...) \
217
((__predict_false(cond)) \
218
? (__FAKE_USE_VA_ARGS(__VA_ARGS__), (void)ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
219
: ((void)0))
220
#endif
221
#endif
222
223
/*
224
* Simplified macro to send a debug log message using the current LOG_TAG.
225
*/
226
#ifndef ALOGD
227
#define ALOGD(...) ((void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
228
#endif
229
230
#ifndef ALOGD_IF
231
#define ALOGD_IF(cond, ...) \
232
((__predict_false(cond)) \
233
? (__FAKE_USE_VA_ARGS(__VA_ARGS__), (void)ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
234
: ((void)0))
235
#endif
236
237
/*
238
* Simplified macro to send an info log message using the current LOG_TAG.
239
*/
240
#ifndef ALOGI
241
#define ALOGI(...) ((void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__))
242
#endif
243
244
#ifndef ALOGI_IF
245
#define ALOGI_IF(cond, ...) \
246
((__predict_false(cond)) \
247
? (__FAKE_USE_VA_ARGS(__VA_ARGS__), (void)ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) \
248
: ((void)0))
249
#endif
250
251
/*
252
* Simplified macro to send a warning log message using the current LOG_TAG.
253
*/
254
#ifndef ALOGW
255
#define ALOGW(...) ((void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
256
#endif
257
258
#ifndef ALOGW_IF
259
#define ALOGW_IF(cond, ...) \
260
((__predict_false(cond)) \
261
? (__FAKE_USE_VA_ARGS(__VA_ARGS__), (void)ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) \
262
: ((void)0))
263
#endif
264
265
/*
266
* Simplified macro to send an error log message using the current LOG_TAG.
267
*/
268
#ifndef ALOGE
269
#define ALOGE(...) ((void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
270
#endif
271
272
#ifndef ALOGE_IF
273
#define ALOGE_IF(cond, ...) \
274
((__predict_false(cond)) \
275
? (__FAKE_USE_VA_ARGS(__VA_ARGS__), (void)ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
276
: ((void)0))
277
#endif
278
279
/* --------------------------------------------------------------------- */
280
281
/*
282
* Conditional based on whether the current LOG_TAG is enabled at
283
* verbose priority.
284
*/
285
#ifndef IF_ALOGV
286
#if LOG_NDEBUG
287
#define IF_ALOGV() if (false)
288
#else
289
#define IF_ALOGV() IF_ALOG(LOG_VERBOSE, LOG_TAG)
290
#endif
291
#endif
292
293
/*
294
* Conditional based on whether the current LOG_TAG is enabled at
295
* debug priority.
296
*/
297
#ifndef IF_ALOGD
298
#define IF_ALOGD() IF_ALOG(LOG_DEBUG, LOG_TAG)
299
#endif
300
301
/*
302
* Conditional based on whether the current LOG_TAG is enabled at
303
* info priority.
304
*/
305
#ifndef IF_ALOGI
306
#define IF_ALOGI() IF_ALOG(LOG_INFO, LOG_TAG)
307
#endif
308
309
/*
310
* Conditional based on whether the current LOG_TAG is enabled at
311
* warn priority.
312
*/
313
#ifndef IF_ALOGW
314
#define IF_ALOGW() IF_ALOG(LOG_WARN, LOG_TAG)
315
#endif
316
317
/*
318
* Conditional based on whether the current LOG_TAG is enabled at
319
* error priority.
320
*/
321
#ifndef IF_ALOGE
322
#define IF_ALOGE() IF_ALOG(LOG_ERROR, LOG_TAG)
323
#endif
324
325
/* --------------------------------------------------------------------- */
326
327
/*
328
* Basic log message macro.
329
*
330
* Example:
331
* ALOG(LOG_WARN, NULL, "Failed with error %d", errno);
332
*
333
* The second argument may be NULL or "" to indicate the "global" tag.
334
*/
335
#ifndef ALOG
336
#define ALOG(priority, tag, ...) LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
337
#endif
338
339
/*
340
* Conditional given a desired logging priority and tag.
341
*/
342
#ifndef IF_ALOG
343
#define IF_ALOG(priority, tag) if (android_testLog(ANDROID_##priority, tag))
344
#endif
345
346
/* --------------------------------------------------------------------- */
347
348
/*
349
* IF_ALOG uses android_testLog, but IF_ALOG can be overridden.
350
* android_testLog will remain constant in its purpose as a wrapper
351
* for Android logging filter policy, and can be subject to
352
* change. It can be reused by the developers that override
353
* IF_ALOG as a convenient means to reimplement their policy
354
* over Android.
355
*/
356
357
/*
358
* Use the per-tag properties "log.tag.<tagname>" to generate a runtime
359
* result of non-zero to expose a log. prio is ANDROID_LOG_VERBOSE to
360
* ANDROID_LOG_FATAL. default_prio if no property. Undefined behavior if
361
* any other value.
362
*/
363
int __android_log_is_loggable(int prio, const char* tag, int default_prio);
364
int __android_log_is_loggable_len(int prio, const char* tag, size_t len, int default_prio);
365
366
#if LOG_NDEBUG /* Production */
367
#define android_testLog(prio, tag) \
368
(__android_log_is_loggable_len(prio, tag, ((tag) && *(tag)) ? strlen(tag) : 0, \
369
ANDROID_LOG_DEBUG) != 0)
370
#else
371
#define android_testLog(prio, tag) \
372
(__android_log_is_loggable_len(prio, tag, ((tag) && *(tag)) ? strlen(tag) : 0, \
373
ANDROID_LOG_VERBOSE) != 0)
374
#endif
375
376
#if defined(__clang__)
377
#pragma clang diagnostic pop
378
#endif
379
380
__END_DECLS
381
382