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