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