1f25ce65dSSergey Makeev // The MIT License (MIT)
2f25ce65dSSergey Makeev //
3f25ce65dSSergey Makeev // 	Copyright (c) 2015 Sergey Makeev, Vadim Slyusarev
4f25ce65dSSergey Makeev //
5f25ce65dSSergey Makeev // 	Permission is hereby granted, free of charge, to any person obtaining a copy
6f25ce65dSSergey Makeev // 	of this software and associated documentation files (the "Software"), to deal
7f25ce65dSSergey Makeev // 	in the Software without restriction, including without limitation the rights
8f25ce65dSSergey Makeev // 	to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9f25ce65dSSergey Makeev // 	copies of the Software, and to permit persons to whom the Software is
10f25ce65dSSergey Makeev // 	furnished to do so, subject to the following conditions:
11f25ce65dSSergey Makeev //
12f25ce65dSSergey Makeev //  The above copyright notice and this permission notice shall be included in
13f25ce65dSSergey Makeev // 	all copies or substantial portions of the Software.
14f25ce65dSSergey Makeev //
15f25ce65dSSergey Makeev // 	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16f25ce65dSSergey Makeev // 	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17f25ce65dSSergey Makeev // 	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18f25ce65dSSergey Makeev // 	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19f25ce65dSSergey Makeev // 	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20f25ce65dSSergey Makeev // 	OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21f25ce65dSSergey Makeev // 	THE SOFTWARE.
22f25ce65dSSergey Makeev 
2358964d0bSSergey Makeev #pragma once
2458964d0bSSergey Makeev 
2558964d0bSSergey Makeev #include <MTTools.h>
2658964d0bSSergey Makeev #include <MTPlatform.h>
2758964d0bSSergey Makeev #include <MTConcurrentQueueLIFO.h>
2858964d0bSSergey Makeev #include <MTStackArray.h>
2956aa031bSSergey Makeev #include <MTArrayView.h>
304a90b4a6SSergey Makeev #include <MTColorTable.h>
31*f4db079dSs.makeev #include <MTStackRequirements.h>
3258964d0bSSergey Makeev 
3358964d0bSSergey Makeev 
3458964d0bSSergey Makeev namespace MT
3558964d0bSSergey Makeev {
3658964d0bSSergey Makeev 	class FiberContext;
37*f4db079dSs.makeev 	typedef void (*TTaskEntryPoint)(FiberContext & context, const void* userData);
38*f4db079dSs.makeev 	typedef void (*TPoolTaskDestroy)(const void* userData);
3958d12dadSSergey Makeev 
4058d12dadSSergey Makeev 
4158964d0bSSergey Makeev 	namespace internal
4258964d0bSSergey Makeev 	{
4358964d0bSSergey Makeev 		////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4458964d0bSSergey Makeev 		// Task description
4558964d0bSSergey Makeev 		////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4658964d0bSSergey Makeev 		struct TaskDesc
4758964d0bSSergey Makeev 		{
4858964d0bSSergey Makeev 			//Task entry point
4958964d0bSSergey Makeev 			TTaskEntryPoint taskFunc;
5058964d0bSSergey Makeev 
5158d12dadSSergey Makeev 			//Task destroy func from pool (dtor call)
5258d12dadSSergey Makeev 			TPoolTaskDestroy poolDestroyFunc;
5358d12dadSSergey Makeev 
5458d12dadSSergey Makeev 			//Task user data (task data context)
55*f4db079dSs.makeev 			const void* userData;
56*f4db079dSs.makeev 
57*f4db079dSs.makeev 			//Stack requirements for task
58*f4db079dSs.makeev 			MT::StackRequirements::Type stackRequirements;
5958964d0bSSergey Makeev 
60a1626843SSergey Makeev #ifdef MT_INSTRUMENTED_BUILD
61f371f0bdSSergey Makeev 			const mt_char* debugID;
624a90b4a6SSergey Makeev 			MT::Color::Type debugColor;
63a1626843SSergey Makeev #endif
64a1626843SSergey Makeev 
6558964d0bSSergey Makeev 			TaskDesc()
6658964d0bSSergey Makeev 				: taskFunc(nullptr)
6758d12dadSSergey Makeev 				, poolDestroyFunc(nullptr)
6858964d0bSSergey Makeev 				, userData(nullptr)
69*f4db079dSs.makeev 				, stackRequirements(MT::StackRequirements::INVALID)
7058964d0bSSergey Makeev 			{
71a1626843SSergey Makeev #ifdef MT_INSTRUMENTED_BUILD
72a1626843SSergey Makeev 				debugID = nullptr;
734a90b4a6SSergey Makeev 				debugColor = MT::Color::Blue;
74a1626843SSergey Makeev #endif
7558964d0bSSergey Makeev 			}
7658964d0bSSergey Makeev 
77*f4db079dSs.makeev 			TaskDesc(TTaskEntryPoint _taskFunc, const void* _userData, MT::StackRequirements::Type _stackRequirements)
7858964d0bSSergey Makeev 				: taskFunc(_taskFunc)
7958d12dadSSergey Makeev 				, poolDestroyFunc(nullptr)
8058d12dadSSergey Makeev 				, userData(_userData)
81*f4db079dSs.makeev 				, stackRequirements(_stackRequirements)
8258d12dadSSergey Makeev 			{
8358d12dadSSergey Makeev #ifdef MT_INSTRUMENTED_BUILD
8458d12dadSSergey Makeev 				debugID = nullptr;
854a90b4a6SSergey Makeev 				debugColor = MT::Color::Blue;
8658d12dadSSergey Makeev #endif
8758d12dadSSergey Makeev 			}
8858d12dadSSergey Makeev 
89*f4db079dSs.makeev 			TaskDesc(TTaskEntryPoint _taskFunc, TPoolTaskDestroy _poolDestroyFunc, const void* _userData, MT::StackRequirements::Type _stackRequirements)
9058d12dadSSergey Makeev 				: taskFunc(_taskFunc)
9158d12dadSSergey Makeev 				, poolDestroyFunc(_poolDestroyFunc)
9258964d0bSSergey Makeev 				, userData(_userData)
93*f4db079dSs.makeev 				, stackRequirements(_stackRequirements)
9458964d0bSSergey Makeev 			{
95a1626843SSergey Makeev #ifdef MT_INSTRUMENTED_BUILD
96a1626843SSergey Makeev 				debugID = nullptr;
974a90b4a6SSergey Makeev 				debugColor = MT::Color::Blue;
98a1626843SSergey Makeev #endif
9958964d0bSSergey Makeev 			}
10058964d0bSSergey Makeev 
10158964d0bSSergey Makeev 			bool IsValid()
10258964d0bSSergey Makeev 			{
10358964d0bSSergey Makeev 				return (taskFunc != nullptr);
10458964d0bSSergey Makeev 			}
10558964d0bSSergey Makeev 		};
10658964d0bSSergey Makeev 	}
10758964d0bSSergey Makeev 
10858964d0bSSergey Makeev }
109