1*f7a9bfc3Ss.makeev_local #include <MTScheduler.h>
2*f7a9bfc3Ss.makeev_local #include "Profiler.h"
3*f7a9bfc3Ss.makeev_local 
4*f7a9bfc3Ss.makeev_local 
5*f7a9bfc3Ss.makeev_local #ifdef MT_INSTRUMENTED_BUILD
6*f7a9bfc3Ss.makeev_local 
7*f7a9bfc3Ss.makeev_local 
8*f7a9bfc3Ss.makeev_local void PushPerfMarker(const char* name, MT::Color::Type color)
9*f7a9bfc3Ss.makeev_local {
10*f7a9bfc3Ss.makeev_local 	MT_UNUSED(name);
11*f7a9bfc3Ss.makeev_local 	MT_UNUSED(color);
12*f7a9bfc3Ss.makeev_local }
13*f7a9bfc3Ss.makeev_local 
14*f7a9bfc3Ss.makeev_local void PopPerfMarker(const char* name)
15*f7a9bfc3Ss.makeev_local {
16*f7a9bfc3Ss.makeev_local 	MT_UNUSED(name);
17*f7a9bfc3Ss.makeev_local }
18*f7a9bfc3Ss.makeev_local 
19*f7a9bfc3Ss.makeev_local 
20*f7a9bfc3Ss.makeev_local 
21*f7a9bfc3Ss.makeev_local void PushPerfEvent(const char* name)
22*f7a9bfc3Ss.makeev_local {
23*f7a9bfc3Ss.makeev_local 	PushPerfMarker(name, MT::Color::Red);
24*f7a9bfc3Ss.makeev_local }
25*f7a9bfc3Ss.makeev_local 
26*f7a9bfc3Ss.makeev_local void PopPerfEvent(const char* name)
27*f7a9bfc3Ss.makeev_local {
28*f7a9bfc3Ss.makeev_local 	PopPerfMarker(name);
29*f7a9bfc3Ss.makeev_local }
30*f7a9bfc3Ss.makeev_local 
31*f7a9bfc3Ss.makeev_local 
32*f7a9bfc3Ss.makeev_local class Microprofile : public MT::IProfilerEventListener
33*f7a9bfc3Ss.makeev_local {
34*f7a9bfc3Ss.makeev_local public:
35*f7a9bfc3Ss.makeev_local 
36*f7a9bfc3Ss.makeev_local 	Microprofile()
37*f7a9bfc3Ss.makeev_local 	{
38*f7a9bfc3Ss.makeev_local 	}
39*f7a9bfc3Ss.makeev_local 
40*f7a9bfc3Ss.makeev_local 	~Microprofile()
41*f7a9bfc3Ss.makeev_local 	{
42*f7a9bfc3Ss.makeev_local 	}
43*f7a9bfc3Ss.makeev_local 
44*f7a9bfc3Ss.makeev_local 	virtual void OnThreadCreated(uint32 workerIndex) override
45*f7a9bfc3Ss.makeev_local 	{
46*f7a9bfc3Ss.makeev_local 		MT_UNUSED(workerIndex);
47*f7a9bfc3Ss.makeev_local 	}
48*f7a9bfc3Ss.makeev_local 
49*f7a9bfc3Ss.makeev_local 	virtual void OnThreadStarted(uint32 workerIndex) override
50*f7a9bfc3Ss.makeev_local 	{
51*f7a9bfc3Ss.makeev_local 		MT_UNUSED(workerIndex);
52*f7a9bfc3Ss.makeev_local 	}
53*f7a9bfc3Ss.makeev_local 
54*f7a9bfc3Ss.makeev_local 	virtual void OnThreadStoped(uint32 workerIndex) override
55*f7a9bfc3Ss.makeev_local 	{
56*f7a9bfc3Ss.makeev_local 		MT_UNUSED(workerIndex);
57*f7a9bfc3Ss.makeev_local 	}
58*f7a9bfc3Ss.makeev_local 
59*f7a9bfc3Ss.makeev_local 	virtual void OnThreadIdleStarted(uint32 workerIndex) override
60*f7a9bfc3Ss.makeev_local 	{
61*f7a9bfc3Ss.makeev_local 		MT_UNUSED(workerIndex);
62*f7a9bfc3Ss.makeev_local 		PushPerfMarker("ThreadIdle", MT::Color::Red);
63*f7a9bfc3Ss.makeev_local 	}
64*f7a9bfc3Ss.makeev_local 
65*f7a9bfc3Ss.makeev_local 	virtual void OnThreadIdleFinished(uint32 workerIndex) override
66*f7a9bfc3Ss.makeev_local 	{
67*f7a9bfc3Ss.makeev_local 		MT_UNUSED(workerIndex);
68*f7a9bfc3Ss.makeev_local 		PopPerfMarker("ThreadIdle");
69*f7a9bfc3Ss.makeev_local 	}
70*f7a9bfc3Ss.makeev_local 
71*f7a9bfc3Ss.makeev_local 	virtual void OnThreadWaitStarted() override
72*f7a9bfc3Ss.makeev_local 	{
73*f7a9bfc3Ss.makeev_local 		PushPerfMarker("ThreadWait", MT::Color::Red);
74*f7a9bfc3Ss.makeev_local 	}
75*f7a9bfc3Ss.makeev_local 
76*f7a9bfc3Ss.makeev_local 	virtual void OnThreadWaitFinished() override
77*f7a9bfc3Ss.makeev_local 	{
78*f7a9bfc3Ss.makeev_local 		PopPerfMarker("ThreadWait");
79*f7a9bfc3Ss.makeev_local 	}
80*f7a9bfc3Ss.makeev_local 
81*f7a9bfc3Ss.makeev_local 	virtual void NotifyTaskExecuteStateChanged(MT::Color::Type debugColor, const mt_char* debugID, MT::TaskExecuteState::Type type) override
82*f7a9bfc3Ss.makeev_local 	{
83*f7a9bfc3Ss.makeev_local 		switch(type)
84*f7a9bfc3Ss.makeev_local 		{
85*f7a9bfc3Ss.makeev_local 		case MT::TaskExecuteState::START:
86*f7a9bfc3Ss.makeev_local 		case MT::TaskExecuteState::RESUME:
87*f7a9bfc3Ss.makeev_local 			PushPerfMarker(debugID, debugColor);
88*f7a9bfc3Ss.makeev_local 			break;
89*f7a9bfc3Ss.makeev_local 		case MT::TaskExecuteState::STOP:
90*f7a9bfc3Ss.makeev_local 		case MT::TaskExecuteState::SUSPEND:
91*f7a9bfc3Ss.makeev_local 			PopPerfMarker(debugID);
92*f7a9bfc3Ss.makeev_local 			break;
93*f7a9bfc3Ss.makeev_local 		}
94*f7a9bfc3Ss.makeev_local 	}
95*f7a9bfc3Ss.makeev_local };
96*f7a9bfc3Ss.makeev_local 
97*f7a9bfc3Ss.makeev_local 
98*f7a9bfc3Ss.makeev_local #endif
99*f7a9bfc3Ss.makeev_local 
100*f7a9bfc3Ss.makeev_local 
101*f7a9bfc3Ss.makeev_local MT::IProfilerEventListener* GetProfiler()
102*f7a9bfc3Ss.makeev_local {
103*f7a9bfc3Ss.makeev_local #ifdef MT_INSTRUMENTED_BUILD
104*f7a9bfc3Ss.makeev_local 	static Microprofile profile;
105*f7a9bfc3Ss.makeev_local 	return &profile;
106*f7a9bfc3Ss.makeev_local #else
107*f7a9bfc3Ss.makeev_local 	return nullptr;
108*f7a9bfc3Ss.makeev_local #endif
109*f7a9bfc3Ss.makeev_local 
110*f7a9bfc3Ss.makeev_local 
111*f7a9bfc3Ss.makeev_local }
112