14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * plog.c * 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h> 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdarg.h> 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "PFileSystem.h" 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ptypes.h" 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pstdio.h" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ptimestamp.h" 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h" 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_STACKTRACE 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "PStackTrace.h" 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ptrd.h" 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmutex.h" 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined (ANDROID) 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined (HAVE_ANDROID_OS) 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LOG_TAG "Srec" 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <utils/Log.h> 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "phashtable.h" 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MTAG __FILE__ 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define FILTER_MSG_1 "ESR_BUFFER_OVERFLOW" 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define FILTER_MSG_1_SIZE ( sizeof ( FILTER_MSG_1 ) - 1 ) 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define FILTER_MSG_2 "ESR_NO_MATCH_ERROR" 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define FILTER_MSG_2_SIZE ( sizeof ( FILTER_MSG_2 ) - 1 ) 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic unsigned int GlogLevel = 0; 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic PLogger *Glogger = NULL; 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic LOG_OUTPUT_FORMAT GlogFormat = LOG_OUTPUT_FORMAT_MODULE_NAME | 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LOG_OUTPUT_FORMAT_DATE_TIME; 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/** 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Used to detect endless recursion where the PLog module calls itself. 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_BOOL locked = ESR_FALSE; 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic PtrdMutex* Gmutex = NULL; 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef struct FileLogger_t 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogger base; 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PFile* fp; 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectFileLogger; 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/** 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Prints and formats a message to the log. 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param self the PLogger. 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param format the format string specifying the next arguments (a la 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * printf). 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param args variable argument list. 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @return The number of bytes written to the PLogger or -1 if an error 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * occurs. 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode FileLoggerPrintf(PLogger *self, const LCHAR *format, ...) 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FileLogger *p = STATIC_CAST(self, FileLogger, base); 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project va_list args; 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project va_start(args, format); 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = pvfprintf(p->fp, format, args); 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project va_end(args); 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode FileLoggerFlush(PLogger *self) 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FileLogger *p = STATIC_CAST(self, FileLogger, base); 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return pfflush(p->fp) == 0 ? ESR_SUCCESS : ESR_FATAL_ERROR; 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/** 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Destroys the logger. This function is responsible to deallocate any 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * resources used by the logger. In particular, if buffering is internally 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * used, it needs to flush the buffer. 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void FileLoggerDestroy(PLogger *self) 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FileLogger *p = STATIC_CAST(self, FileLogger, base); 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfflush(p->fp); 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (p->fp != PSTDERR && p->fp != PSTDOUT) 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfclose(p->fp); 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(p); 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode createPFileLogger(PFile* fp, PLogger** logger) 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FileLogger* fileLogger; 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (fp == NULL) 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fileLogger = NEW(FileLogger, MTAG); 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (fileLogger == NULL) 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_OUT_OF_MEMORY; 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fileLogger->base.printf = FileLoggerPrintf; 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fileLogger->base.flush = FileLoggerFlush; 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fileLogger->base.destroy = FileLoggerDestroy; 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fileLogger->fp = fp; 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *logger = &fileLogger->base; 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/** 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Initializes the LOG library. This function must be called before any 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * logging can take place. 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param logger The logger to be used to output the messages. If NULL, then 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * logging goes to PSTDERR. @param logLevel The level of logging requested. 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @return ESR_SUCCESS if success, anything else if an error occurs. 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PLogInit(PLogger *logger, unsigned int logLevel) 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (Glogger != NULL) 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project GlogLevel = logLevel; 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = PtrdMutexCreate(&Gmutex)) != ESR_SUCCESS) 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (logger != NULL) 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Glogger = logger; 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = createPFileLogger(PSTDERR, &Glogger); 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (Gmutex != NULL) 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PtrdMutexDestroy(Gmutex); 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Gmutex = NULL; 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PLogIsInitialized(ESR_BOOL* isInit) 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isInit == NULL) 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *isInit = Glogger != NULL; 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PLogIsLocked(ESR_BOOL* isLocked) 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (isLocked == NULL) 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *isLocked = locked; 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/** 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Shutdowns the LOG library. Once this function is called, no logging activity can be performed. 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Also, the logger that was given to pLogInit is destroyed. 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @return ESR_SUCCESS if success, anything else if an error occurs. 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PLogShutdown() 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (Glogger == NULL) 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((rc = PtrdMutexDestroy(Gmutex)) != ESR_SUCCESS) 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Gmutex = NULL; 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (Glogger->flush != NULL) 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Glogger->flush(Glogger); 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Glogger->destroy(Glogger); 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Glogger = NULL; 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PLogGetLevel(unsigned int *logLevel) 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (Glogger == NULL) 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (logLevel == NULL) 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *logLevel = GlogLevel; 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PLogSetLevel(unsigned int logLevel) 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (Glogger == NULL) 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project GlogLevel = logLevel; 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define TIME_BUF_SIZE 24 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define TIME_FORMAT L("%Y/%m/%d %H:%M:%S") 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PLOG_PANIC(x, rc) \ 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project do \ 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { \ 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { \ 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, L("[%s:%d] %s failed with %s\n"), __FILE__, __LINE__, x, ESR_rc2str(rc)); \ 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfflush(PSTDERR); \ 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } \ 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } while (0) 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic ESR_ReturnCode logIt(const LCHAR *format, va_list args, ESR_BOOL showStackTrace) 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc = ESR_SUCCESS; 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode flushRC = ESR_SUCCESS; 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_STACKTRACE 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define BUFFER_SIZE P_MAX_STACKTRACE + 2000 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define BUFFER_SIZE 2000 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR buffer[BUFFER_SIZE] = L(""); 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // TODO: Remove once logging subsystem supports "warn" level 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (strstr(format, "ESR_BUFFER_OVERFLOW")==format) 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_STACKTRACE 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (Glogger == NULL) 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * There are three possible scenerios for why logging would occur although the PLog module 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * is uninitialized: 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 1) The code fails before PLog is initialized (perhaps in other portable components) 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 2) The user forgets to initialize the PLog module 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 3) The code fails after PLog is uninitialized (on shutdown) 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * We do our best by logging any errors but this might result in the memory leak of 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * the PStackTrace module in case 3. 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PStackTraceCreate(); 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLOG_PANIC(L("PStackTraceCreate"), rc); 2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PtrdMutexLock(Gmutex); 3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (locked) 3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project locked = ESR_TRUE; 3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (GlogFormat & LOG_OUTPUT_FORMAT_DATE_TIME) 3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PTimeStamp now; 3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project struct tm* loctime; 3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR timeStr[TIME_BUF_SIZE]; 3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t timeStrSize; 3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PTimeStampSet(&now); 3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project loctime = localtime(&now.secs); 3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project timeStrSize = LSTRFTIME(timeStr, TIME_BUF_SIZE, TIME_FORMAT, loctime); 3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(timeStrSize == (TIME_BUF_SIZE - 5)); 3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psprintf(timeStr + (TIME_BUF_SIZE - 5), ".%03hu", now.msecs); 3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psprintf(buffer + LSTRLEN(buffer), L("%s|"), timeStr); 3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(LSTRLEN(buffer) < BUFFER_SIZE); 3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (GlogFormat & LOG_OUTPUT_FORMAT_THREAD_ID) 3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = psprintf(buffer + LSTRLEN(buffer), L("trd=%u|"), PtrdGetCurrentThreadId()); 3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(LSTRLEN(buffer) < BUFFER_SIZE); 3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (GlogFormat & LOG_OUTPUT_FORMAT_MODULE_NAME && showStackTrace) 3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t len = P_MAX_STACKTRACE; 3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR text[P_MAX_STACKTRACE]; 3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR* index; 3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i; 3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PStackTraceGetValue((LCHAR*) & text, &len); 3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_SUCCESS) 3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < 2; ++i) 3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PStackTracePopLevel((LCHAR*) & text); 3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLOG_PANIC(L("PStackTracePopLevel"), rc); 3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project index = text; 3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (index) 3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project index = LSTRSTR(index, L(" at\n")); 3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (index != NULL) 3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *(index + 1) = L('<'); 3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *(index + 2) = L('-'); 3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *(index + 3) = L(' '); 3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (rc == ESR_NOT_SUPPORTED) 3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(text, L("")); 3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (rc != ESR_SUCCESS) 3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLOG_PANIC(L("PStackTraceGetValue"), rc); 3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = psprintf(buffer + LSTRLEN(buffer), L("Module=%s|"), text); 3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(LSTRLEN(buffer) < BUFFER_SIZE); 3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pvsprintf(buffer + LSTRLEN(buffer), format, args); 3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pvsprintf(buffer + LSTRLEN(buffer), format, args); 3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(LSTRLEN(buffer) < BUFFER_SIZE); 3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project psprintf(buffer + LSTRLEN(buffer), L("\n")); 3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project passert(LSTRLEN(buffer) < BUFFER_SIZE); 3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (Glogger != NULL) 3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = Glogger->printf(Glogger, L("%s"), buffer); 3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc != ESR_SUCCESS) 3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project flushRC = Glogger->flush(Glogger); 3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* We need to log but the logging module is disabled or is locked so we output to stderr instead */ 3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, L("%s"), buffer); 3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfflush(PSTDERR); 3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project locked = ESR_FALSE; 4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PtrdMutexUnlock(Gmutex); 4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return flushRC; 4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (Glogger != NULL && Glogger->flush != NULL) 4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project flushRC = Glogger->flush(Glogger); 4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project locked = ESR_FALSE; 4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_THREAD 4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PtrdMutexUnlock(Gmutex); 4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc != ESR_SUCCESS ? rc : flushRC; 4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/** 4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Conditionally PLogs a message. The message is logged only if module is enabled. 4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param msg The message format specification (ala printf). 4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @return ESR_SUCCESS if success, anything else if an error occurs. 4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PLogMessage(const char* msg, ...) 4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project va_list args; 4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if USE_STACKTRACE 4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t depth; 4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined (ANDROID) 4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined (HAVE_ANDROID_OS) 4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ( ESR_SUCCESS );/* Get rid of this for phone device */ 4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (Glogger == NULL) 4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_STATE; 4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_STACKTRACE 4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = PStackTraceGetDepth(&depth); 4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_NOT_SUPPORTED) 4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Debugging symbols are missing */ 4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (rc != ESR_SUCCESS) 4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pfprintf(PSTDERR, L("PStackTraceGetDepth"), ESR_rc2str(rc)); 4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project goto CLEANUP; 4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Remove PLogMessage() from depth */ 4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project --depth; 4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (GlogLevel < depth) 4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project va_start(args, msg); 4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = logIt(msg, args, ESR_FALSE); 4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project va_end(args); 4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if USE_STACKTRACE 4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/** 4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unconditionally logs an error message. 4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param msg The message format specification (ala printf). 4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @return ESR_SUCCESS if success, anything else if an error occurs. 4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PLogError(const char* msg, ...) 4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project va_list args; 4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined (ANDROID) 4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined (HAVE_ANDROID_OS) 4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char log_text [2048]; 4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project va_start(args, msg); 4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined (ANDROID) 4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined (HAVE_ANDROID_OS) 4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pvsprintf ( log_text, msg, args); 4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* We need to disable some error messages because they are frequently not 4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * errors but due to sloppy use of some functions. This prevents us from 4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * getting flooded with bad error messages. SteveR 4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( ( strncmp ( log_text, FILTER_MSG_1, FILTER_MSG_1_SIZE ) != 0 ) && 4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ( strncmp ( log_text, FILTER_MSG_2, FILTER_MSG_2_SIZE ) != 0 ) ) 4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 495040dcc36996cded4371cc59dfc3a9e53247a61f5Steve Block ALOGE ("%s", log_text ); 4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = 0; 4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = logIt(msg, args, ESR_TRUE); 5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = logIt(msg, args, ESR_TRUE); 5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project va_end(args); 5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PLogCreateFileLogger(PFile* file, PLogger **logger) 5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (logger == NULL || file == NULL) 5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return createPFileLogger(file, logger); 5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/** 5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Creates a logger that logs to a circular file. 5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param filename The name of the file to be created. 5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param maxsize The maximum number of bytes that the file may have. 5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @param logger logger handle receiving the created logger. 5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PLogCreateCircularFileLogger(const LCHAR *filename, 5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project unsigned int maxsize, 5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogger **logger) 5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_NOT_SUPPORTED; 5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode PLogSetFormat(LOG_OUTPUT_FORMAT format) 5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project GlogFormat = format; 5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 539