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#ifndef _LIBS_LOG_LOG_SYSTEM_H
18#define _LIBS_LOG_LOG_SYSTEM_H
19
20#include <android/log.h>
21#include <log/log_id.h>
22
23/*
24 * Normally we strip the effects of ALOGV (VERBOSE messages),
25 * LOG_FATAL and LOG_FATAL_IF (FATAL assert messages) from the
26 * release builds be defining NDEBUG.  You can modify this (for
27 * example with "#define LOG_NDEBUG 0" at the top of your source
28 * file) to change that behavior.
29 */
30
31#ifndef LOG_NDEBUG
32#ifdef NDEBUG
33#define LOG_NDEBUG 1
34#else
35#define LOG_NDEBUG 0
36#endif
37#endif
38
39#ifndef __predict_false
40#define __predict_false(exp) __builtin_expect((exp) != 0, 0)
41#endif
42
43/*
44 * Simplified macro to send a verbose system log message using current LOG_TAG.
45 */
46#ifndef SLOGV
47#define __SLOGV(...)                                                          \
48  ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VERBOSE, LOG_TAG, \
49                                 __VA_ARGS__))
50#if LOG_NDEBUG
51#define SLOGV(...)          \
52  do {                      \
53    if (0) {                \
54      __SLOGV(__VA_ARGS__); \
55    }                       \
56  } while (0)
57#else
58#define SLOGV(...) __SLOGV(__VA_ARGS__)
59#endif
60#endif
61
62#ifndef SLOGV_IF
63#if LOG_NDEBUG
64#define SLOGV_IF(cond, ...) ((void)0)
65#else
66#define SLOGV_IF(cond, ...)                                                 \
67  ((__predict_false(cond))                                                  \
68       ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VERBOSE, \
69                                        LOG_TAG, __VA_ARGS__))              \
70       : (void)0)
71#endif
72#endif
73
74/*
75 * Simplified macro to send a debug system log message using current LOG_TAG.
76 */
77#ifndef SLOGD
78#define SLOGD(...)                                                          \
79  ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, \
80                                 __VA_ARGS__))
81#endif
82
83#ifndef SLOGD_IF
84#define SLOGD_IF(cond, ...)                                               \
85  ((__predict_false(cond))                                                \
86       ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, \
87                                        LOG_TAG, __VA_ARGS__))            \
88       : (void)0)
89#endif
90
91/*
92 * Simplified macro to send an info system log message using current LOG_TAG.
93 */
94#ifndef SLOGI
95#define SLOGI(...)                                                         \
96  ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, LOG_TAG, \
97                                 __VA_ARGS__))
98#endif
99
100#ifndef SLOGI_IF
101#define SLOGI_IF(cond, ...)                                              \
102  ((__predict_false(cond))                                               \
103       ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, \
104                                        LOG_TAG, __VA_ARGS__))           \
105       : (void)0)
106#endif
107
108/*
109 * Simplified macro to send a warning system log message using current LOG_TAG.
110 */
111#ifndef SLOGW
112#define SLOGW(...)                                                         \
113  ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN, LOG_TAG, \
114                                 __VA_ARGS__))
115#endif
116
117#ifndef SLOGW_IF
118#define SLOGW_IF(cond, ...)                                              \
119  ((__predict_false(cond))                                               \
120       ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN, \
121                                        LOG_TAG, __VA_ARGS__))           \
122       : (void)0)
123#endif
124
125/*
126 * Simplified macro to send an error system log message using current LOG_TAG.
127 */
128#ifndef SLOGE
129#define SLOGE(...)                                                          \
130  ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR, LOG_TAG, \
131                                 __VA_ARGS__))
132#endif
133
134#ifndef SLOGE_IF
135#define SLOGE_IF(cond, ...)                                               \
136  ((__predict_false(cond))                                                \
137       ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR, \
138                                        LOG_TAG, __VA_ARGS__))            \
139       : (void)0)
140#endif
141
142#endif /* _LIBS_LOG_LOG_SYSTEM_H */
143