summaryrefslogtreecommitdiff
path: root/tools/common/debug.cpp
blob: 94d8ed99160da464e6c8fd1e8f90f4ac80a9be13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/*
 * MiniCargo - mrustc's minimal clone of cargo
 * - By John Hodge (Mutabah/thePowersGang)
 *
 * debug.cpp
 * - Debugging helpers
 */
#if defined(__MINGW32__)
# define DISABLE_MULTITHREAD    // Mingw32 doesn't have c++11 threads
#endif
#include <set>
#include <iostream>
#include "debug.h"
#include <mutex>

static int giIndentLevel = 0;
static const char* gsDebugPhase = "";
static ::std::set<::std::string> gmDisabledDebug;
#ifndef DISABLE_MULTITHREAD
static ::std::mutex gDebugLock;
#endif

void Debug_SetPhase(const char* phase_name)
{
    gsDebugPhase = phase_name;
}
bool Debug_IsEnabled()
{
    if( gmDisabledDebug.find(gsDebugPhase) != gmDisabledDebug.end() )
        return false;
    return true;
}
void Debug_DisablePhase(const char* phase_name)
{
    gmDisabledDebug.insert( ::std::string(phase_name) );
}
void Debug_EnablePhase(const char* phase_name)
{
    auto it = gmDisabledDebug.find(phase_name);
    if( it != gmDisabledDebug.end() )
    {
        gmDisabledDebug.erase(it);
    }
}
void Debug_Print(::std::function<void(::std::ostream& os)> cb)
{
    if( !Debug_IsEnabled() )
        return ;
#ifndef DISABLE_MULTITHREAD
    ::std::unique_lock<::std::mutex>    _lh { gDebugLock };
#endif

    ::std::cout << gsDebugPhase << "- ";
    for(auto i = giIndentLevel; i --; )
        ::std::cout << " ";
    cb(::std::cout);
    ::std::cout << ::std::endl;
}
void Debug_EnterScope(const char* name, dbg_cb_t cb)
{
    if( !Debug_IsEnabled() )
        return ;
#ifndef DISABLE_MULTITHREAD
    ::std::unique_lock<::std::mutex>    _lh { gDebugLock };
#endif

    ::std::cout << gsDebugPhase << "- ";
    for(auto i = giIndentLevel; i --; )
        ::std::cout << " ";
    ::std::cout << ">>> " << name << "(";
    cb(::std::cout);
    ::std::cout << ")" << ::std::endl;
    giIndentLevel ++;
}
void Debug_LeaveScope(const char* name, dbg_cb_t cb)
{
    if( !Debug_IsEnabled() )
        return ;
#ifndef DISABLE_MULTITHREAD
    ::std::unique_lock<::std::mutex>    _lh { gDebugLock };
#endif

    ::std::cout << gsDebugPhase << "- ";
    giIndentLevel --;
    for(auto i = giIndentLevel; i --; )
        ::std::cout << " ";
    ::std::cout << "<<< " << name << ::std::endl;
}