static int __stdcall workerThreadFunc(void *payload) { size_t startId = ((size_t)payload) * (csmQueueCount / TASKS_MAX_PRIORITY); tmThreadName(gTelemetryContext, 0, "worker %d", int(payload)); tmEnter(gTelemetryContext, TMZF_NONE, "worker"); // Walk the queues and pull data out. size_t curQueue = startId; for ( ; ; ) { int ttl = csmQueueCount * 2; while (ttl--) { task_t *taskToRun = task_queue_dequeue(&gQueues[curQueue++ % csmQueueCount]); if (!taskToRun) { continue; } taskToRun->callback(taskToRun->payload, taskToRun); taskToRun->state = TS_Done; break; } if (ttl == -1) { break; } } tmLeave(gTelemetryContext); return 0; }
void tmCloseIfOpen(void) { if (tmBaseRegion != NULL) { tmLeave(NULL,NULL); } }
void loom_thread_join(ThreadHandle th) { tmEnter(gTelemetryContext, TMZF_NONE, "thread_join"); tmTryLock(gTelemetryContext, th, "thread_join"); WaitForSingleObject(th, INFINITE); tmEndTryLock(gTelemetryContext, th, TMLR_SUCCESS); CloseHandle(th); tmLeave(gTelemetryContext); }
void loom_thread_yield() { tmEnter(gTelemetryContext, TMZF_IDLE, "thread_yield"); SwitchToThread(); tmLeave(gTelemetryContext); }
void loom_thread_sleep(long ms) { tmEnter(gTelemetryContext, TMZF_IDLE, "thread_sleep"); Sleep(ms); tmLeave(gTelemetryContext); }