Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (c) 2010, Texas Instruments Incorporated
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *
      9  * *  Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  *
     12  * *  Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * *  Neither the name of Texas Instruments Incorporated nor the names of
     17  *    its contributors may be used to endorse or promote products derived
     18  *    from this software without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 /*
     34 *   @file  timm_osal_trace.c
     35 *   This file contains methods that provides the functionality
     36 *   for logging errors/warings/information/etc.
     37 *
     38 *  @path \
     39 *
     40 */
     41 /* -------------------------------------------------------------------------- */
     42 /* =========================================================================
     43  *!
     44  *! Revision History
     45  *! ===================================
     46  *!
     47  * ========================================================================= */
     48 
     49 /******************************************************************************
     50 * Includes
     51 ******************************************************************************/
     52 
     53 /*#include "typedefs.h"*/
     54 #include <stdarg.h>
     55 #include <stdio.h>
     56 #include <stdlib.h>
     57 #include "timm_osal_trace.h"
     58 
     59 #ifdef _Android
     60 #define LOG_TAG "DOMX"
     61 #include <utils/Log.h>
     62 #include <cutils/properties.h>
     63 #endif
     64 
     65 /**
     66 * The OSAL debug trace detail can be set at compile time by defining the flag
     67 * TIMM_OSAL_DEBUG_TRACE_DETAIL=<Details>
     68 * detail - 0 - no detail
     69 *          1 - function name
     70 *          2 - function name, line number
     71 * Prefix is added to every debug trace message
     72 */
     73 #ifndef TIMM_OSAL_DEBUG_TRACE_DETAIL
     74 #define TIMM_OSAL_DEBUG_TRACE_DETAIL 2
     75 #endif
     76 
     77 #define DEFAULT_TRACE_LEVEL TIMM_OSAL_TRACE_LEVEL_ERROR
     78 
     79 static int trace_level = -1;
     80 
     81 /* strip out leading ../ stuff that happens to __FILE__ for out-of-tree builds */
     82 static const char *simplify_path(const char *file)
     83 {
     84 	while (file)
     85 	{
     86 		char c = file[0];
     87 		if ((c != '.') && (c != '/') && (c != '\\'))
     88 			break;
     89 		file++;
     90 	}
     91 	return file;
     92 }
     93 
     94 void TIMM_OSAL_UpdateTraceLevel(void)
     95 {
     96 	char *val = getenv("TIMM_OSAL_DEBUG_TRACE_LEVEL");
     97 
     98 	if (val)
     99 	{
    100 		trace_level = strtol(val, NULL, 0);
    101 	}
    102 	else
    103 	{
    104 #ifdef _Android
    105 		char value[PROPERTY_VALUE_MAX];
    106 		int val;
    107 
    108 		property_get("debug.domx.trace_level", value, "0");
    109 		val = atoi(value);
    110 		if ( (!val) || (val < 0) )
    111 		{
    112 			trace_level = DEFAULT_TRACE_LEVEL;
    113 		}
    114 		else
    115 			trace_level = val;
    116 #else
    117 		trace_level = DEFAULT_TRACE_LEVEL;
    118 #endif
    119 	}
    120 }
    121 
    122 void __TIMM_OSAL_TraceFunction(const __TIMM_OSAL_TRACE_LOCATION * loc,
    123     const char *fmt, ...)
    124 {
    125 	if (trace_level == -1)
    126 	{
    127 		char *val = getenv("TIMM_OSAL_DEBUG_TRACE_LEVEL");
    128 		trace_level =
    129 		    val ? strtol(val, NULL, 0) : DEFAULT_TRACE_LEVEL;
    130 	}
    131 
    132 	if (trace_level >= loc->level)
    133 	{
    134 		va_list ap;
    135 
    136 		va_start(ap, fmt);	/* make ap point to first arg after 'fmt' */
    137 
    138 #ifdef _Android
    139 
    140 #if 0 // Original for reference
    141 #if ( TIMM_OSAL_DEBUG_TRACE_DETAIL > 1 )
    142 		ALOGD("%s:%d\t%s()\t", simplify_path(loc->file), loc->line,
    143 		    loc->function);
    144 #endif
    145 #else // Prints function_name for ERROR, WARNING and ENTRY/EXIT
    146 	if ( (loc->level == TIMM_OSAL_TRACE_LEVEL_ERROR) || (loc->level == TIMM_OSAL_TRACE_LEVEL_WARNING) || (loc->level == TIMM_OSAL_TRACE_LEVEL_ENTERING) )
    147 		ALOGD("%s:%d\t%s()\t", simplify_path(loc->file), loc->line,
    148 		    loc->function);
    149 #endif
    150 
    151 		char string[1000];
    152 		vsprintf(string, fmt, ap);
    153 		ALOGD("%s",string);
    154 
    155 #else
    156 
    157 #if 0 // Original for reference
    158 #if ( TIMM_OSAL_DEBUG_TRACE_DETAIL > 1 )
    159 		printf("%s:%d\t%s()\t", simplify_path(loc->file), loc->line,
    160 		    loc->function);
    161 #endif
    162 #else // Prints function_name for ERROR, WARNING and ENTRY/EXIT
    163 		if ( (loc->level == 1) || (loc->level == 2) || (loc->level == 5) )
    164 			printf("%s:%d\t%s()\t", simplify_path(loc->file), loc->line,
    165 		    loc->function);
    166 #endif
    167 
    168 		vprintf(fmt, ap);
    169 
    170 #endif
    171 
    172 		va_end(ap);
    173 	}
    174 }
    175