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