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> 2756aa031bSSergey Makeev #include <MTArrayView.h> 284a90b4a6SSergey Makeev #include <MTColorTable.h> 29f4db079dSs.makeev #include <MTStackRequirements.h> 3058964d0bSSergey Makeev 3158964d0bSSergey Makeev 3258964d0bSSergey Makeev namespace MT 3358964d0bSSergey Makeev { 3458964d0bSSergey Makeev class FiberContext; 35f4db079dSs.makeev typedef void (*TTaskEntryPoint)(FiberContext & context, const void* userData); 36f4db079dSs.makeev typedef void (*TPoolTaskDestroy)(const void* userData); 3758d12dadSSergey Makeev 3858d12dadSSergey Makeev 3958964d0bSSergey Makeev namespace internal 4058964d0bSSergey Makeev { 4158964d0bSSergey Makeev //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 4258964d0bSSergey Makeev // Task description 4358964d0bSSergey Makeev //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 4458964d0bSSergey Makeev struct TaskDesc 4558964d0bSSergey Makeev { 4658964d0bSSergey Makeev //Task entry point 4758964d0bSSergey Makeev TTaskEntryPoint taskFunc; 4858964d0bSSergey Makeev 4958d12dadSSergey Makeev //Task destroy func from pool (dtor call) 5058d12dadSSergey Makeev TPoolTaskDestroy poolDestroyFunc; 5158d12dadSSergey Makeev 5258d12dadSSergey Makeev //Task user data (task data context) 53f4db079dSs.makeev const void* userData; 54f4db079dSs.makeev 55f4db079dSs.makeev //Stack requirements for task 56f4db079dSs.makeev MT::StackRequirements::Type stackRequirements; 5758964d0bSSergey Makeev 58b23bdf5aSs.makeev_local //Priority for task 59b23bdf5aSs.makeev_local MT::TaskPriority::Type priority; 60b23bdf5aSs.makeev_local 61a1626843SSergey Makeev #ifdef MT_INSTRUMENTED_BUILD 62f371f0bdSSergey Makeev const mt_char* debugID; 634a90b4a6SSergey Makeev MT::Color::Type debugColor; 64a1626843SSergey Makeev #endif 65a1626843SSergey Makeev TaskDescTaskDesc6658964d0bSSergey Makeev TaskDesc() 6758964d0bSSergey Makeev : taskFunc(nullptr) 6858d12dadSSergey Makeev , poolDestroyFunc(nullptr) 6958964d0bSSergey Makeev , userData(nullptr) 70f4db079dSs.makeev , stackRequirements(MT::StackRequirements::INVALID) 71*576e57aaSDmitry Tsarevich , priority(MT::TaskPriority::INVALID) 7258964d0bSSergey Makeev { 73a1626843SSergey Makeev #ifdef MT_INSTRUMENTED_BUILD 74a1626843SSergey Makeev debugID = nullptr; 754a90b4a6SSergey Makeev debugColor = MT::Color::Blue; 76a1626843SSergey Makeev #endif 7758964d0bSSergey Makeev } 7858964d0bSSergey Makeev TaskDescTaskDesc79b23bdf5aSs.makeev_local TaskDesc(TTaskEntryPoint _taskFunc, const void* _userData, MT::StackRequirements::Type _stackRequirements, MT::TaskPriority::Type _priority) 8058964d0bSSergey Makeev : taskFunc(_taskFunc) 8158d12dadSSergey Makeev , poolDestroyFunc(nullptr) 8258d12dadSSergey Makeev , userData(_userData) 83f4db079dSs.makeev , stackRequirements(_stackRequirements) 84b23bdf5aSs.makeev_local , priority(_priority) 8558d12dadSSergey Makeev { 8658d12dadSSergey Makeev #ifdef MT_INSTRUMENTED_BUILD 8758d12dadSSergey Makeev debugID = nullptr; 884a90b4a6SSergey Makeev debugColor = MT::Color::Blue; 8958d12dadSSergey Makeev #endif 9058d12dadSSergey Makeev } 9158d12dadSSergey Makeev TaskDescTaskDesc92f4db079dSs.makeev TaskDesc(TTaskEntryPoint _taskFunc, TPoolTaskDestroy _poolDestroyFunc, const void* _userData, MT::StackRequirements::Type _stackRequirements) 9358d12dadSSergey Makeev : taskFunc(_taskFunc) 9458d12dadSSergey Makeev , poolDestroyFunc(_poolDestroyFunc) 9558964d0bSSergey Makeev , userData(_userData) 96f4db079dSs.makeev , stackRequirements(_stackRequirements) 97*576e57aaSDmitry Tsarevich , priority(MT::TaskPriority::INVALID) 9858964d0bSSergey Makeev { 99a1626843SSergey Makeev #ifdef MT_INSTRUMENTED_BUILD 100a1626843SSergey Makeev debugID = nullptr; 1014a90b4a6SSergey Makeev debugColor = MT::Color::Blue; 102a1626843SSergey Makeev #endif 10358964d0bSSergey Makeev } 10458964d0bSSergey Makeev IsValidTaskDesc10558964d0bSSergey Makeev bool IsValid() 10658964d0bSSergey Makeev { 10758964d0bSSergey Makeev return (taskFunc != nullptr); 10858964d0bSSergey Makeev } 10958964d0bSSergey Makeev }; 11058964d0bSSergey Makeev } 11158964d0bSSergey Makeev 11258964d0bSSergey Makeev } 113