1cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/*
2cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
3cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
4cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * you may not use this file except in compliance with the License.
6cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * You may obtain a copy of the License at
7cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
8cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project *
10cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * See the License for the specific language governing permissions and
14cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * limitations under the License.
15cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */
16cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
17cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project//
18cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// C/C++ logging functions.  See the logging documentation for API details.
19cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project//
20cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// We'd like these to be available from C code (in case we import some from
21cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// somewhere), so this has a C interface.
22cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project//
23cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// The output will be correct when the log file is shared between multiple
24cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// threads and/or multiple processes so long as the operating system
25cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// supports O_APPEND.  These calls have mutex-protected data structures
26cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// and so are NOT reentrant.  Do not use LOG in a signal handler.
27cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project//
28cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#ifndef _LIBS_UTILS_LOG_H
29cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#define _LIBS_UTILS_LOG_H
30cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
316454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown#include <sys/types.h>
326454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown
33cfd5b080af8de527d768f0ff7902c26af8d49307Mark Salyzyn#include <log/log.h>
3466ce3e08c5632a20ea66bde6dd76397041edf034Mark Salyzyn
356454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown#ifdef __cplusplus
366454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown
376454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brownnamespace android {
386454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown
396454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown/*
406454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown * A very simple utility that yells in the log when an operation takes too long.
416454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown */
426454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brownclass LogIfSlow {
436454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brownpublic:
446454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown    LogIfSlow(const char* tag, android_LogPriority priority,
456454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown            int timeoutMillis, const char* message);
466454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown    ~LogIfSlow();
476454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown
486454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brownprivate:
496454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown    const char* const mTag;
506454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown    const android_LogPriority mPriority;
516454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown    const int mTimeoutMillis;
526454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown    const char* const mMessage;
536454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown    const int64_t mStart;
546454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown};
556454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown
566454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown/*
576454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown * Writes the specified debug log message if this block takes longer than the
586454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown * specified number of milliseconds to run.  Includes the time actually taken.
596454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown *
606454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown * {
616454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown *     ALOGD_IF_SLOW(50, "Excessive delay doing something.");
626454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown *     doSomething();
636454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown * }
646454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown */
656454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown#define ALOGD_IF_SLOW(timeoutMillis, message) \
66ca3e2a276afa03cfffb2b989e28adfc44ec50d6fNaseer Ahmed    android::LogIfSlow _logIfSlow(LOG_TAG, ANDROID_LOG_DEBUG, timeoutMillis, message);
676454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown
686454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown} // namespace android
696454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown
706454f461665a44b1e47d277d8b92415b5bbce2d8Jeff Brown#endif // __cplusplus
71cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
72cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#endif // _LIBS_UTILS_LOG_H
73