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 
449c716f68Ss.makeev_local 	virtual void OnFibersCreated(uint32 fibersCount) override
459c716f68Ss.makeev_local 	{
469c716f68Ss.makeev_local 		MT_UNUSED(fibersCount);
479c716f68Ss.makeev_local 	}
489c716f68Ss.makeev_local 
499c716f68Ss.makeev_local 	virtual void OnThreadsCreated(uint32 threadsCount) override
509c716f68Ss.makeev_local 	{
519c716f68Ss.makeev_local 		MT_UNUSED(threadsCount);
529c716f68Ss.makeev_local 	}
539c716f68Ss.makeev_local 
54f7a9bfc3Ss.makeev_local 	virtual void OnThreadCreated(uint32 workerIndex) override
55f7a9bfc3Ss.makeev_local 	{
56f7a9bfc3Ss.makeev_local 		MT_UNUSED(workerIndex);
57f7a9bfc3Ss.makeev_local 	}
58f7a9bfc3Ss.makeev_local 
59f7a9bfc3Ss.makeev_local 	virtual void OnThreadStarted(uint32 workerIndex) override
60f7a9bfc3Ss.makeev_local 	{
61f7a9bfc3Ss.makeev_local 		MT_UNUSED(workerIndex);
62f7a9bfc3Ss.makeev_local 	}
63f7a9bfc3Ss.makeev_local 
64f7a9bfc3Ss.makeev_local 	virtual void OnThreadStoped(uint32 workerIndex) override
65f7a9bfc3Ss.makeev_local 	{
66f7a9bfc3Ss.makeev_local 		MT_UNUSED(workerIndex);
67f7a9bfc3Ss.makeev_local 	}
68f7a9bfc3Ss.makeev_local 
69f7a9bfc3Ss.makeev_local 	virtual void OnThreadIdleStarted(uint32 workerIndex) override
70f7a9bfc3Ss.makeev_local 	{
71f7a9bfc3Ss.makeev_local 		MT_UNUSED(workerIndex);
72f7a9bfc3Ss.makeev_local 		PushPerfMarker("ThreadIdle", MT::Color::Red);
73f7a9bfc3Ss.makeev_local 	}
74f7a9bfc3Ss.makeev_local 
75f7a9bfc3Ss.makeev_local 	virtual void OnThreadIdleFinished(uint32 workerIndex) override
76f7a9bfc3Ss.makeev_local 	{
77f7a9bfc3Ss.makeev_local 		MT_UNUSED(workerIndex);
78f7a9bfc3Ss.makeev_local 		PopPerfMarker("ThreadIdle");
79f7a9bfc3Ss.makeev_local 	}
80f7a9bfc3Ss.makeev_local 
81f7a9bfc3Ss.makeev_local 	virtual void OnThreadWaitStarted() override
82f7a9bfc3Ss.makeev_local 	{
83f7a9bfc3Ss.makeev_local 		PushPerfMarker("ThreadWait", MT::Color::Red);
84f7a9bfc3Ss.makeev_local 	}
85f7a9bfc3Ss.makeev_local 
86f7a9bfc3Ss.makeev_local 	virtual void OnThreadWaitFinished() override
87f7a9bfc3Ss.makeev_local 	{
88f7a9bfc3Ss.makeev_local 		PopPerfMarker("ThreadWait");
89f7a9bfc3Ss.makeev_local 	}
90f7a9bfc3Ss.makeev_local 
91*47ecee31Ss.makeev_local 	virtual void OnTemporaryWorkerThreadJoin() override
92f7a9bfc3Ss.makeev_local 	{
93*47ecee31Ss.makeev_local 	}
94*47ecee31Ss.makeev_local 
95*47ecee31Ss.makeev_local 	virtual void OnTemporaryWorkerThreadLeave() override
96*47ecee31Ss.makeev_local 	{
97*47ecee31Ss.makeev_local 	}
98*47ecee31Ss.makeev_local 
99*47ecee31Ss.makeev_local 	virtual void OnTaskExecuteStateChanged(MT::Color::Type debugColor, const mt_char* debugID, MT::TaskExecuteState::Type type, int32 fiberIndex) override
100*47ecee31Ss.makeev_local 	{
101*47ecee31Ss.makeev_local 		MT_UNUSED(fiberIndex);
102*47ecee31Ss.makeev_local 
103f7a9bfc3Ss.makeev_local 		switch(type)
104f7a9bfc3Ss.makeev_local 		{
105f7a9bfc3Ss.makeev_local 		case MT::TaskExecuteState::START:
106f7a9bfc3Ss.makeev_local 		case MT::TaskExecuteState::RESUME:
107f7a9bfc3Ss.makeev_local 			PushPerfMarker(debugID, debugColor);
108f7a9bfc3Ss.makeev_local 			break;
109f7a9bfc3Ss.makeev_local 		case MT::TaskExecuteState::STOP:
110f7a9bfc3Ss.makeev_local 		case MT::TaskExecuteState::SUSPEND:
111f7a9bfc3Ss.makeev_local 			PopPerfMarker(debugID);
112f7a9bfc3Ss.makeev_local 			break;
113f7a9bfc3Ss.makeev_local 		}
114f7a9bfc3Ss.makeev_local 	}
115f7a9bfc3Ss.makeev_local };
116f7a9bfc3Ss.makeev_local 
117f7a9bfc3Ss.makeev_local 
118f7a9bfc3Ss.makeev_local #endif
119f7a9bfc3Ss.makeev_local 
120f7a9bfc3Ss.makeev_local 
121f7a9bfc3Ss.makeev_local MT::IProfilerEventListener* GetProfiler()
122f7a9bfc3Ss.makeev_local {
123f7a9bfc3Ss.makeev_local #ifdef MT_INSTRUMENTED_BUILD
124f7a9bfc3Ss.makeev_local 	static Microprofile profile;
125f7a9bfc3Ss.makeev_local 	return &profile;
126f7a9bfc3Ss.makeev_local #else
127f7a9bfc3Ss.makeev_local 	return nullptr;
128f7a9bfc3Ss.makeev_local #endif
129f7a9bfc3Ss.makeev_local 
130f7a9bfc3Ss.makeev_local 
131f7a9bfc3Ss.makeev_local }
132