158964d0bSSergey Makeev #include <MTScheduler.h> 258964d0bSSergey Makeev 358964d0bSSergey Makeev namespace MT 458964d0bSSergey Makeev { 558964d0bSSergey Makeev namespace internal 658964d0bSSergey Makeev { 758964d0bSSergey Makeev static const size_t TASK_BUFFER_CAPACITY = 4096; 858964d0bSSergey Makeev 958964d0bSSergey Makeev ThreadContext::ThreadContext() 1058964d0bSSergey Makeev : lastActiveFiberContext(nullptr) 1158964d0bSSergey Makeev , taskScheduler(nullptr) 1258964d0bSSergey Makeev , hasNewTasksEvent(EventReset::AUTOMATIC, true) 1358964d0bSSergey Makeev , state(ThreadState::ALIVE) 1458964d0bSSergey Makeev , descBuffer(TASK_BUFFER_CAPACITY) 1558964d0bSSergey Makeev { 1658964d0bSSergey Makeev } 1758964d0bSSergey Makeev 1858964d0bSSergey Makeev ThreadContext::~ThreadContext() 1958964d0bSSergey Makeev { 2058964d0bSSergey Makeev } 2158964d0bSSergey Makeev 2258964d0bSSergey Makeev void ThreadContext::RestoreAwaitingTasks(TaskGroup::Type taskGroup) 2358964d0bSSergey Makeev { 2458964d0bSSergey Makeev ASSERT(taskScheduler, "Invalid Task Scheduler"); 2558964d0bSSergey Makeev ASSERT(taskScheduler->IsWorkerThread(), "Can't use RunAsync outside Task. Use TaskScheduler.RunAsync() instead."); 2658964d0bSSergey Makeev 2758964d0bSSergey Makeev ConcurrentQueueLIFO<FiberContext*> & groupQueue = taskScheduler->waitTaskQueues[taskGroup]; 2858964d0bSSergey Makeev 2958964d0bSSergey Makeev if (groupQueue.IsEmpty()) 3058964d0bSSergey Makeev { 3158964d0bSSergey Makeev return; 3258964d0bSSergey Makeev } 3358964d0bSSergey Makeev 3458964d0bSSergey Makeev //copy awaiting tasks list to stack 3558964d0bSSergey Makeev stack_array<FiberContext*, MT_MAX_FIBERS_COUNT> groupQueueCopy(MT_MAX_FIBERS_COUNT, nullptr); 3658964d0bSSergey Makeev size_t taskCount = groupQueue.PopAll(groupQueueCopy.begin(), groupQueueCopy.size()); 3758964d0bSSergey Makeev 3858964d0bSSergey Makeev fixed_array<internal::GroupedTask> buffer(&descBuffer.front(), taskCount); 3958964d0bSSergey Makeev 4058964d0bSSergey Makeev TaskScheduler & scheduler = *(taskScheduler); 4158964d0bSSergey Makeev size_t bucketCount = Min((size_t)scheduler.GetWorkerCount(), taskCount); 42*b7b54a39SSergey Makeev fixed_array<internal::TaskBucket> buckets(ALLOCATE_ON_STACK(sizeof(internal::TaskBucket) * bucketCount), bucketCount); 4358964d0bSSergey Makeev 44*b7b54a39SSergey Makeev internal::DistibuteDescriptions(TaskGroup::GROUP_UNDEFINED, groupQueueCopy.begin(), buffer, buckets); 4558964d0bSSergey Makeev scheduler.RunTasksImpl(buckets, nullptr, true); 4658964d0bSSergey Makeev } 4758964d0bSSergey Makeev 4858964d0bSSergey Makeev } 4958964d0bSSergey Makeev 5058964d0bSSergey Makeev } 51