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); } }
int StatsTable::GetSlot() const { TLSData* data = GetTLSData(); if(!data) { return 0; } return data->slot; }
void StatsTable::UnregisterThread() { UnregisterThread(GetTLSData()); }