FIBER_START_FUNCTION_CLASS_IMPL(TaskScheduler, FiberSwitchStart) {
	TaskScheduler *taskScheduler = reinterpret_cast<TaskScheduler *>(arg);
	ThreadId threadId = FTLGetCurrentThreadId();

	while (true) {
		taskScheduler->m_fiberPool.enqueue(GetTLSData(tls_originFiber));
		FiberType destFiber = GetTLSData(tls_destFiber);

		FTLSetCurrentFiber(destFiber);
		FTLSwitchToFiber(taskScheduler->m_fiberSwitchingFibers[threadId], destFiber);
	}
}
FIBER_START_FUNCTION_CLASS_IMPL(TaskScheduler, CounterWaitStart) {
	TaskScheduler *taskScheduler = reinterpret_cast<TaskScheduler *>(arg);
	ThreadId threadId = FTLGetCurrentThreadId();

	while (true) {
		taskScheduler->m_waitingTaskLock.lock();
		taskScheduler->m_waitingTasks.emplace_back(GetTLSData(tls_originFiber), GetTLSData(tls_waitingCounter), GetTLSData(tls_waitingValue));
		taskScheduler->m_waitingTaskLock.unlock();

		FiberType destFiber = GetTLSData(tls_destFiber);

		FTLSetCurrentFiber(destFiber);
		FTLSwitchToFiber(taskScheduler->m_counterWaitingFibers[threadId], destFiber);
	}
}
Example #3
0
 int StatsTable::GetSlot() const
 {
     TLSData* data = GetTLSData();
     if(!data)
     {
         return 0;
     }
     return data->slot;
 }
Example #4
0
 void StatsTable::UnregisterThread()
 {
     UnregisterThread(GetTLSData());
 }