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