log.h revision e2bf2ea4d2846031edfc52b942ad53e5467243f6
14f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
24f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
34f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
44f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
54f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * you may not use this file except in compliance with the License.
64f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * You may obtain a copy of the License at
74f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
84f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
94f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project *
104f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * See the License for the specific language governing permissions and
144f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * limitations under the License.
154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project//
184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// C/C++ logging functions.  See the logging documentation for API details.
194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project//
204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// We'd like these to be available from C code (in case we import some from
214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// somewhere), so this has a C interface.
224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project//
234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// The output will be correct when the log file is shared between multiple
244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// threads and/or multiple processes so long as the operating system
254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// supports O_APPEND.  These calls have mutex-protected data structures
264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// and so are NOT reentrant.  Do not use LOG in a signal handler.
274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project//
284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef _LIBS_CUTILS_LOG_H
294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define _LIBS_CUTILS_LOG_H
304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <stdio.h>
324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <time.h>
334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <sys/types.h>
34982a815c10cc28707d81c46112fc45b1c10df3beColin Cross#include <unistd.h>
354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifdef HAVE_PTHREADS
364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <pthread.h>
37b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#endif
38ed8a7d84428ec945c48b6b53dc5a3a18fabaf683Colin Cross#include <stdarg.h>
39ed8a7d84428ec945c48b6b53dc5a3a18fabaf683Colin Cross
404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <cutils/uio.h>
414f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#include <cutils/logd.h>
4202863b957cfbfc302d3136ed78c0cba86accacd8Brian Swetland
4302863b957cfbfc302d3136ed78c0cba86accacd8Brian Swetland#ifdef __cplusplus
444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectextern "C" {
450dd7ca6e87abb689700c5e3a816a949b03b1154bColin Cross#endif
460dd7ca6e87abb689700c5e3a816a949b03b1154bColin Cross
474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// ---------------------------------------------------------------------
484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Normally we strip LOGV (VERBOSE messages) from release builds.
514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * You can modify this (for example with "#define LOG_NDEBUG 0"
52b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * at the top of your source file) to change that behavior.
53b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross */
544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef LOG_NDEBUG
554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifdef NDEBUG
564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOG_NDEBUG 1
574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#else
584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOG_NDEBUG 0
594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
625f5d5c8cef10f28950fa108a8bd86d55f11b7ef4Nick Kralevich/*
634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * This is the local tag used for the following simplified
644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * logging macros.  You can change this preprocessor definition
654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * before using the other macros to change the tag.
664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef LOG_TAG
684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOG_TAG NULL
694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// ---------------------------------------------------------------------
724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Simplified macro to send a verbose log message using the current LOG_TAG.
755f5d5c8cef10f28950fa108a8bd86d55f11b7ef4Nick Kralevich */
764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef LOGV
774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#if LOG_NDEBUG
784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOGV(...)   ((void)0)
794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#else
804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOGV(...) ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
824f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
834f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
844f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define CONDITION(cond)     (__builtin_expect((cond)!=0, 0))
854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
864f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef LOGV_IF
87bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#if LOG_NDEBUG
884f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOGV_IF(cond, ...)   ((void)0)
894f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#else
904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOGV_IF(cond, ...) \
914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ( (CONDITION(cond)) \
924f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ? ((void)LOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
934f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    : (void)0 )
944f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
98bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland * Simplified macro to send a debug log message using the current LOG_TAG.
99bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland */
10044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#ifndef LOGD
1014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOGD(...) ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__))
102bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#endif
103bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland
104bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#ifndef LOGD_IF
105bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#define LOGD_IF(cond, ...) \
1064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ( (CONDITION(cond)) \
1074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ? ((void)LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
1084f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    : (void)0 )
109bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#endif
110bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland
1114f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
1124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Simplified macro to send an info log message using the current LOG_TAG.
113bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland */
114bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#ifndef LOGI
115bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#define LOGI(...) ((void)LOG(LOG_INFO, LOG_TAG, __VA_ARGS__))
116bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#endif
117bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland
118bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#ifndef LOGI_IF
1194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOGI_IF(cond, ...) \
1204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ( (CONDITION(cond)) \
1214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ? ((void)LOG(LOG_INFO, LOG_TAG, __VA_ARGS__)) \
1224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    : (void)0 )
1234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
124bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland
125bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland/*
126bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland * Simplified macro to send a warning log message using the current LOG_TAG.
127bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland */
128bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#ifndef LOGW
1294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOGW(...) ((void)LOG(LOG_WARN, LOG_TAG, __VA_ARGS__))
1304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
1314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
132bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#ifndef LOGW_IF
1334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOGW_IF(cond, ...) \
134bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland    ( (CONDITION(cond)) \
135bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland    ? ((void)LOG(LOG_WARN, LOG_TAG, __VA_ARGS__)) \
136bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland    : (void)0 )
1374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
138bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland
139bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland/*
140bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland * Simplified macro to send an error log message using the current LOG_TAG.
141bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland */
142bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#ifndef LOGE
143bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#define LOGE(...) ((void)LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__))
144bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#endif
1454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef LOGE_IF
147bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#define LOGE_IF(cond, ...) \
1484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ( (CONDITION(cond)) \
1494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ? ((void)LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
150bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland    : (void)0 )
151bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland#endif
152bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland
153bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland// ---------------------------------------------------------------------
154bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland
155bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland/*
156bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland * Conditional based on whether the current LOG_TAG is enabled at
157bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland * verbose priority.
1584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
1594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef IF_LOGV
1604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#if LOG_NDEBUG
1614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define IF_LOGV() if (false)
1624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#else
1634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define IF_LOGV() IF_LOG(LOG_VERBOSE, LOG_TAG)
16444b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#endif
16544b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#endif
16644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross
16744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross/*
16844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross * Conditional based on whether the current LOG_TAG is enabled at
16944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross * debug priority.
17044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross */
17144b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#ifndef IF_LOGD
17244b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#define IF_LOGD() IF_LOG(LOG_DEBUG, LOG_TAG)
17344b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#endif
17444b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross
17544b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross/*
17644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross * Conditional based on whether the current LOG_TAG is enabled at
17744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross * info priority.
17844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross */
17944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#ifndef IF_LOGI
18044b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#define IF_LOGI() IF_LOG(LOG_INFO, LOG_TAG)
1814f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
18244b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross
18344b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross/*
18444b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross * Conditional based on whether the current LOG_TAG is enabled at
1854f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * warn priority.
18644b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross */
18744b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#ifndef IF_LOGW
18844b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#define IF_LOGW() IF_LOG(LOG_WARN, LOG_TAG)
18944b65d047cc39baf30e21bfd8dd438f6bc1f77f5Colin Cross#endif
1904f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1914f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
192bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland * Conditional based on whether the current LOG_TAG is enabled at
193bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland * error priority.
194bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland */
1954f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef IF_LOGE
1964f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define IF_LOGE() IF_LOG(LOG_ERROR, LOG_TAG)
1974f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
1984f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
1994f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// ---------------------------------------------------------------------
2014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
20217dcc5c57dcffb919f3de65ff7a0134ffa3bd874Colin Cross/*
2036405c6953fa02d41d9f6377f4cdb947604f481c4Nick Pelly * Simplified macro to send a verbose system log message using the current LOG_TAG.
2046405c6953fa02d41d9f6377f4cdb947604f481c4Nick Pelly */
2056405c6953fa02d41d9f6377f4cdb947604f481c4Nick Pelly#ifndef SLOGV
2066405c6953fa02d41d9f6377f4cdb947604f481c4Nick Pelly#if LOG_NDEBUG
2076405c6953fa02d41d9f6377f4cdb947604f481c4Nick Pelly#define SLOGV(...)   ((void)0)
2086405c6953fa02d41d9f6377f4cdb947604f481c4Nick Pelly#else
2094f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define SLOGV(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
2106405c6953fa02d41d9f6377f4cdb947604f481c4Nick Pelly#endif
2116405c6953fa02d41d9f6377f4cdb947604f481c4Nick Pelly#endif
2124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define CONDITION(cond)     (__builtin_expect((cond)!=0, 0))
2141e070846f8908dff15086efa12fbba01ab7eae15Chuck Tuffli
2154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef SLOGV_IF
2164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#if LOG_NDEBUG
2174f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define SLOGV_IF(cond, ...)   ((void)0)
2184f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#else
2194f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define SLOGV_IF(cond, ...) \
2204f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ( (CONDITION(cond)) \
2214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)) \
2224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    : (void)0 )
2234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
2244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
2254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
2274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Simplified macro to send a debug system log message using the current LOG_TAG.
2284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
2294f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef SLOGD
2304f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define SLOGD(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
2314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
2324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2334f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef SLOGD_IF
2344f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define SLOGD_IF(cond, ...) \
2354f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ( (CONDITION(cond)) \
2364f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) \
2374f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    : (void)0 )
2384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
2394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
240b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross/*
241b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * Simplified macro to send an info system log message using the current LOG_TAG.
2424f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
2434f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef SLOGI
2444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define SLOGI(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))
2454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
2464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2474f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef SLOGI_IF
2484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define SLOGI_IF(cond, ...) \
2494f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ( (CONDITION(cond)) \
2504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)) \
2514f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    : (void)0 )
2524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
2534f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2544f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
2554f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Simplified macro to send a warning system log message using the current LOG_TAG.
2564f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
2574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef SLOGW
2584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define SLOGW(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__))
2594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
2604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef SLOGW_IF
2624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define SLOGW_IF(cond, ...) \
263b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    ( (CONDITION(cond)) \
264b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)) \
265b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    : (void)0 )
266b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#endif
267b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
268b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross/*
2694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Simplified macro to send an error system log message using the current LOG_TAG.
2704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
2714f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef SLOGE
2724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define SLOGE(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))
2734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
2744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
2754f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef SLOGE_IF
2764f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define SLOGE_IF(cond, ...) \
2774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ( (CONDITION(cond)) \
2784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    ? ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)) \
2794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    : (void)0 )
2804f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
281b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
282b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
283b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
284b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross// ---------------------------------------------------------------------
285b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
286b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross/*
287b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * Log a fatal error.  If the given condition fails, this stops program
288b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * execution like a normal assertion, but also generating the given message.
289b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * It is NOT stripped from release builds.  Note that the condition test
290b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * is -inverted- from the normal assert() semantics.
291b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross */
292b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#define LOG_ALWAYS_FATAL_IF(cond, ...) \
293b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    ( (CONDITION(cond)) \
294b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    ? ((void)android_printAssert(#cond, LOG_TAG, __VA_ARGS__)) \
295b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    : (void)0 )
296b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
297b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#define LOG_ALWAYS_FATAL(...) \
298b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    ( ((void)android_printAssert(NULL, LOG_TAG, __VA_ARGS__)) )
299b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
300b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross/*
301b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * Versions of LOG_ALWAYS_FATAL_IF and LOG_ALWAYS_FATAL that
302b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * are stripped out of release builds.
303b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross */
304b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#if LOG_NDEBUG
305b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
306b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#define LOG_FATAL_IF(cond, ...) ((void)0)
307b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#define LOG_FATAL(...) ((void)0)
308b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
309b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#else
310b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
311b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#define LOG_FATAL_IF(cond, ...) LOG_ALWAYS_FATAL_IF(cond, __VA_ARGS__)
312b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#define LOG_FATAL(...) LOG_ALWAYS_FATAL(__VA_ARGS__)
313b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
314b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#endif
315b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
316b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross/*
317b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * Assertion that generates a log message when the assertion fails.
318b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * Stripped out of release builds.  Uses the current LOG_TAG.
319b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross */
320b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#define LOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), __VA_ARGS__)
321b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross//#define LOG_ASSERT(cond) LOG_FATAL_IF(!(cond), "Assertion failed: " #cond)
322b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
323b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross// ---------------------------------------------------------------------
324b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
325b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross/*
326b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * Basic log message macro.
327b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross *
328b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * Example:
329b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross *  LOG(LOG_WARN, NULL, "Failed with error %d", errno);
330b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross *
331b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * The second argument may be NULL or "" to indicate the "global" tag.
332b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross */
333b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#ifndef LOG
334b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#define LOG(priority, tag, ...) \
335b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    LOG_PRI(ANDROID_##priority, tag, __VA_ARGS__)
336b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#endif
337b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
338b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross/*
339b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * Log macro that allows you to specify a number for the priority.
340b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross */
341b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#ifndef LOG_PRI
342b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#define LOG_PRI(priority, tag, ...) \
343b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    android_printLog(priority, tag, __VA_ARGS__)
3444f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
3454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3464f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
34793ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood * Log macro that allows you to pass in a varargs ("args" is a va_list).
3484f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
349b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#ifndef LOG_PRI_VA
3504f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define LOG_PRI_VA(priority, tag, fmt, args) \
351b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    android_vprintLog(priority, NULL, tag, fmt, args)
3524f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
353bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland
354bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland/*
355bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland * Conditional given a desired logging priority and tag.
356bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland */
3574f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#ifndef IF_LOG
3584f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define IF_LOG(priority, tag) \
3594f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    if (android_testLog(ANDROID_##priority, tag))
3604f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#endif
3614f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3624f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project// ---------------------------------------------------------------------
3634f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3644f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
3654f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Event logging.
3664f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project */
3674f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3684f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project/*
3694f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * Event log entry types.  These must match up with the declarations in
3704f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project * java/android/android/util/EventLog.java.
37135237d135807af84bf9b0e5b8d7f8633e58db6f5The Android Open Source Project */
3724f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projecttypedef enum {
3734f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    EVENT_TYPE_INT      = 0,
3744f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    EVENT_TYPE_LONG     = 1,
375b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    EVENT_TYPE_STRING   = 2,
376b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross    EVENT_TYPE_LIST     = 3,
3774f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project} AndroidEventLogType;
3784f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
3794f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
38093ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood#define LOG_EVENT_INT(_tag, _value) {                                       \
38193ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood        int intBuf = _value;                                                \
38293ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood        (void) android_btWriteLog(_tag, EVENT_TYPE_INT, &intBuf,            \
38393ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood            sizeof(intBuf));                                                \
38493ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood    }
38593ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood#define LOG_EVENT_LONG(_tag, _value) {                                      \
38693ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood        long long longBuf = _value;                                         \
38793ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood        (void) android_btWriteLog(_tag, EVENT_TYPE_LONG, &longBuf,          \
38893ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood            sizeof(longBuf));                                               \
38993ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood    }
39093ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood#define LOG_EVENT_STRING(_tag, _value)                                      \
39193ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood    ((void) 0)  /* not implemented -- must combine len with string */
39293ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood/* TODO: something for LIST */
39393ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood
39493ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood/*
39593ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood * ===========================================================================
39693ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood *
39793ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood * The stuff in the rest of this file should not be used directly.
39893ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood */
39993ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood
4004f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define android_printLog(prio, tag, fmt...) \
4014f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    __android_log_print(prio, tag, fmt)
40235237d135807af84bf9b0e5b8d7f8633e58db6f5The Android Open Source Project
4034f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define android_vprintLog(prio, cond, tag, fmt...) \
4044f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    __android_log_vprint(prio, tag, fmt)
40535237d135807af84bf9b0e5b8d7f8633e58db6f5The Android Open Source Project
4064f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define android_printAssert(cond, tag, fmt...) \
4074f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    __android_log_assert(cond, tag, fmt)
408fc0182eb1db0620eb71fb6ca219b15a17dcd912fIliyan Malchev
409fc0182eb1db0620eb71fb6ca219b15a17dcd912fIliyan Malchev#define android_writeLog(prio, tag, text) \
410fc0182eb1db0620eb71fb6ca219b15a17dcd912fIliyan Malchev    __android_log_write(prio, tag, text)
411fc0182eb1db0620eb71fb6ca219b15a17dcd912fIliyan Malchev
4124f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define android_bWriteLog(tag, payload, len) \
4134f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    __android_log_bwrite(tag, payload, len)
41435237d135807af84bf9b0e5b8d7f8633e58db6f5The Android Open Source Project#define android_btWriteLog(tag, type, payload, len) \
4154f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    __android_log_btwrite(tag, type, payload, len)
4164f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
4175bb44c8ea2bc513fefc526918980ab3d17494eccXiaopeng Yang// TODO: remove these prototypes and their users
4185bb44c8ea2bc513fefc526918980ab3d17494eccXiaopeng Yang#define android_testLog(prio, tag) (1)
4195bb44c8ea2bc513fefc526918980ab3d17494eccXiaopeng Yang#define android_writevLog(vec,num) do{}while(0)
42035237d135807af84bf9b0e5b8d7f8633e58db6f5The Android Open Source Project#define android_write1Log(str,len) do{}while (0)
4214f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define android_setMinPriority(tag, prio) do{}while(0)
4224f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project//#define android_logToCallback(func) do{}while(0)
4234f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define android_logToFile(tag, file) (0)
4244f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project#define android_logToFd(tag, fd) (0)
4254f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
4264f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projecttypedef enum {
4274f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    LOG_ID_MAIN = 0,
4284f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    LOG_ID_RADIO = 1,
42993ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood    LOG_ID_EVENTS = 2,
43093ac1559b8c7ad3125ddcd896082b030faadbbd4Mike Lockwood    LOG_ID_SYSTEM = 3,
4314f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
4324f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project    LOG_ID_MAX
433bc57d4ce925a62f14c28c55e0ff28af1114f12beBrian Swetland} log_id_t;
434b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
435b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross/*
436b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross * Send a simple string to the log.
437b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross */
4384f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectint __android_log_buf_write(int bufID, int prio, const char *tag, const char *text);
4394f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Projectint __android_log_buf_print(int bufID, int prio, const char *tag, const char *fmt, ...);
4404f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
441b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross
442b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#ifdef __cplusplus
443b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross}
444b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#endif
4454f6e8d7a00cbeda1e70cc15be9c4af1018bdad5The Android Open Source Project
446b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross#endif // _LIBS_CUTILS_LOG_H
447b0ab94b7d5a888f0b6920b156e5c6a075fa0741aColin Cross