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