blob: 3884d651fe76b3f3ccf547883a4db186f65819f6 (
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
89
90
91
92
|
/*
* 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);
}
else
{
::std::cerr << "Unknown debug phase: " << phase_name << ::std::endl;
}
}
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;
}
|