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