1 #pragma once 2 3 #include <MTTools.h> 4 #include <MTPlatform.h> 5 #include <MTConcurrentQueueLIFO.h> 6 #include <MTGroupedTask.h> 7 8 namespace MT 9 { 10 class FiberContext; 11 class TaskScheduler; 12 13 namespace internal 14 { 15 16 namespace ThreadState 17 { 18 const uint32 ALIVE = 0; 19 const uint32 EXIT = 1; 20 }; 21 22 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 23 // Thread (Scheduler fiber) context 24 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 25 struct ThreadContext 26 { 27 FiberContext* lastActiveFiberContext; 28 29 // pointer to task manager 30 TaskScheduler* taskScheduler; 31 32 // thread 33 Thread thread; 34 35 // scheduler fiber 36 Fiber schedulerFiber; 37 38 // task queue awaiting execution 39 ConcurrentQueueLIFO<internal::GroupedTask> queue; 40 41 // new task was arrived to queue event 42 Event hasNewTasksEvent; 43 44 // whether thread is alive 45 AtomicInt state; 46 47 // Temporary buffer 48 std::vector<internal::GroupedTask> descBuffer; 49 50 // prevent false sharing between threads 51 uint8 cacheline[64]; 52 53 ThreadContext(); 54 ~ThreadContext(); 55 56 void RestoreAwaitingTasks(TaskGroup::Type taskGroup); 57 }; 58 59 } 60 61 } 62