124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DNBLog.cpp ----------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Created by Greg Clayton on 6/18/07. 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNBLog.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic int g_debug = 0; 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic int g_verbose = 0; 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined (DNBLOG_ENABLED) 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdio.h> 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdarg.h> 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdlib.h> 24b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton#include <sys/time.h> 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <unistd.h> 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <mach/mach.h> 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <pthread.h> 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "PThreadMutex.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t g_log_bits = 0; 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic DNBCallbackLog g_log_callback = NULL; 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void *g_log_baton = NULL; 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBLogGetDebug () 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_debug; 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBLogSetDebug (int g) 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner g_debug = g; 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBLogGetVerbose () 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_verbose; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBLogSetVerbose (int v) 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner g_verbose = v; 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBLogCheckLogBit (uint32_t bit) 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (g_log_bits & bit) != 0; 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBLogSetLogMask (uint32_t mask) 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t old = g_log_bits; 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner g_log_bits = mask; 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return old; 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBLogGetLogMask () 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_log_bits; 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBLogSetLogCallback (DNBCallbackLog callback, void *baton) 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner g_log_callback = callback; 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner g_log_baton = baton; 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 879c81c3322b68e49530b5c2180f8a0db8c6a494fbGreg ClaytonDNBCallbackLog 889c81c3322b68e49530b5c2180f8a0db8c6a494fbGreg ClaytonDNBLogGetLogCallback () 899c81c3322b68e49530b5c2180f8a0db8c6a494fbGreg Clayton{ 909c81c3322b68e49530b5c2180f8a0db8c6a494fbGreg Clayton return g_log_callback; 919c81c3322b68e49530b5c2180f8a0db8c6a494fbGreg Clayton} 929c81c3322b68e49530b5c2180f8a0db8c6a494fbGreg Clayton 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDNBLogEnabled () 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return g_log_callback != NULL; 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 10024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonDNBLogEnabledForAny (uint32_t mask) 10124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 10224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (g_log_callback) 10324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return (g_log_bits & mask) != 0; 10424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 10524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline void 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner_DNBLogVAPrintf(uint32_t flags, const char *format, va_list args) 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 109c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton static PThreadMutex g_LogThreadedMutex(PTHREAD_MUTEX_RECURSIVE); 110c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton PTHREAD_MUTEX_LOCKER(locker, g_LogThreadedMutex); 111c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_log_callback) 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner g_log_callback(g_log_baton, flags, format, args); 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner_DNBLog(uint32_t flags, const char *format, ...) 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner _DNBLogVAPrintf(flags, format, args); 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print debug strings if and only if the global g_debug is set to 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// a non-zero value. 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner_DNBLogDebug (const char *format, ...) 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DNBLogEnabled () && g_debug) 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner _DNBLogVAPrintf(DNBLOG_FLAG_DEBUG, format, args); 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print debug strings if and only if the global g_debug is set to 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// a non-zero value. 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner_DNBLogDebugVerbose (const char *format, ...) 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DNBLogEnabled () && g_debug && g_verbose) 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner _DNBLogVAPrintf(DNBLOG_FLAG_DEBUG | DNBLOG_FLAG_VERBOSE, format, args); 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic uint32_t g_message_id = 0; 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Prefix the formatted log string with process and thread IDs and 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// suffix it with a newline. 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner_DNBLogThreaded (const char *format, ...) 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DNBLogEnabled ()) 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 170c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton //PTHREAD_MUTEX_LOCKER(locker, GetLogThreadedMutex()); 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 180b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton static struct timeval g_timeval = { 0 , 0 }; 181b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton static struct timeval tv; 182b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton static struct timeval delta; 183b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton gettimeofday(&tv, NULL); 184b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton if (g_timeval.tv_sec == 0) 185b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton { 186b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton delta.tv_sec = 0; 187b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton delta.tv_usec = 0; 188b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton } 189b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton else 190b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton { 191b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton timersub (&tv, &g_timeval, &delta); 192b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton } 193b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton g_timeval = tv; 194e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton 195e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton // Calling "mach_port_deallocate()" bumps the reference count on the thread 196e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton // port, so we need to deallocate it. mach_task_self() doesn't bump the ref 197e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton // count. 198e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton thread_port_t thread_self = mach_thread_self(); 199e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton 2000e8147bd867e4cdaae9400f56d02c7aacd40a9b3Greg Clayton _DNBLog (DNBLOG_FLAG_THREADED, "%u +%lu.%06u sec [%4.4x/%4.4x]: %s", 201b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton ++g_message_id, 202b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton delta.tv_sec, 203b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton delta.tv_usec, 204b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton getpid(), 205e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton thread_self, 206b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton arg_msg); 207e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton 208e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton mach_port_deallocate(mach_task_self(), thread_self); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Prefix the formatted log string with process and thread IDs and 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// suffix it with a newline. 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner_DNBLogThreadedIf (uint32_t log_bit, const char *format, ...) 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DNBLogEnabled () && (log_bit & g_log_bits) == log_bit) 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 223c1f4587c3cc1b6de2f59d472762e9eb16819feffGreg Clayton //PTHREAD_MUTEX_LOCKER(locker, GetLogThreadedMutex()); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 233b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton static struct timeval g_timeval = { 0 , 0 }; 234b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton static struct timeval tv; 235b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton static struct timeval delta; 236b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton gettimeofday(&tv, NULL); 237b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton if (g_timeval.tv_sec == 0) 238b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton { 239b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton delta.tv_sec = 0; 240b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton delta.tv_usec = 0; 241b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton } 242b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton else 243b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton { 244b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton timersub (&tv, &g_timeval, &delta); 245b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton } 246b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton g_timeval = tv; 247e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton 248e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton // Calling "mach_port_deallocate()" bumps the reference count on the thread 249e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton // port, so we need to deallocate it. mach_task_self() doesn't bump the ref 250e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton // count. 251e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton thread_port_t thread_self = mach_thread_self(); 252e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton 253e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton _DNBLog (DNBLOG_FLAG_THREADED, "%u +%lu.%06u sec [%4.4x/%4.4x]: %s", 254b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton ++g_message_id, 255b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton delta.tv_sec, 256b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton delta.tv_usec, 257b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton getpid(), 258e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton thread_self, 259b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton arg_msg); 260e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton 261e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton mach_port_deallocate(mach_task_self(), thread_self); 262e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of errors that are not fatal. 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner_DNBLogError (const char *format, ...) 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DNBLogEnabled ()) 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner _DNBLog (DNBLOG_FLAG_ERROR, "error: %s", arg_msg); 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of errors that ARE fatal. Exit with ERR exit code 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// immediately. 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner_DNBLogFatalError (int err, const char *format, ...) 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DNBLogEnabled ()) 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner _DNBLog (DNBLOG_FLAG_ERROR | DNBLOG_FLAG_FATAL, "error: %s", arg_msg); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::exit (err); 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of warnings that are not fatal only if verbose mode is 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// enabled. 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner_DNBLogVerbose (const char *format, ...) 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DNBLogEnabled () && g_verbose) 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner _DNBLogVAPrintf(DNBLOG_FLAG_VERBOSE, format, args); 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of warnings that are not fatal only if verbose mode is 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// enabled. 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner_DNBLogWarningVerbose (const char *format, ...) 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DNBLogEnabled () && g_verbose) 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner _DNBLog (DNBLOG_FLAG_WARNING | DNBLOG_FLAG_VERBOSE, "warning: %s", arg_msg); 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Printing of warnings that are not fatal. 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner_DNBLogWarning (const char *format, ...) 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (DNBLogEnabled ()) 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *arg_msg = NULL; 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::vasprintf (&arg_msg, format, args); 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (arg_msg != NULL) 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner _DNBLog (DNBLOG_FLAG_WARNING, "warning: %s", arg_msg); 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner free (arg_msg); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 378