void runtime·profileloop1(void) { M *mp, *allm; void *thread; runtime·stdcall(runtime·SetThreadPriority, 2, (uintptr)-2, (uintptr)THREAD_PRIORITY_HIGHEST); for(;;) { runtime·stdcall(runtime·WaitForSingleObject, 2, profiletimer, (uintptr)-1); allm = runtime·atomicloadp(&runtime·allm); for(mp = allm; mp != nil; mp = mp->alllink) { thread = runtime·atomicloadp(&mp->thread); // Do not profile threads blocked on Notes, // this includes idle worker threads, // idle timer thread, idle heap scavenger, etc. if(thread == nil || mp->profilehz == 0 || mp->blocked) continue; runtime·stdcall(runtime·SuspendThread, 1, thread); if(mp->profilehz != 0 && !mp->blocked) profilem(mp); runtime·stdcall(runtime·ResumeThread, 1, thread); } } }
void runtime·profileloop1(void) { M *mp, *allm; void *thread; runtime·stdcall(runtime·SetThreadPriority, 2, (uintptr)-2, (uintptr)THREAD_PRIORITY_HIGHEST); for(;;) { runtime·stdcall(runtime·WaitForSingleObject, 2, profiletimer, (uintptr)-1); allm = runtime·atomicloadp(&runtime·allm); for(mp = allm; mp != nil; mp = mp->alllink) { thread = runtime·atomicloadp(&mp->thread); if(thread == nil) continue; runtime·stdcall(runtime·SuspendThread, 1, thread); if(mp->profilehz != 0) profilem(mp); runtime·stdcall(runtime·ResumeThread, 1, thread); } } }