29#pragma comment(lib, "psapi.lib")
82#if KMP_ARCH_X86 || KMP_ARCH_ARM
112#if KMP_ARCH_X86 || KMP_ARCH_ARM
127 PVOID, ULONG, PULONG);
136#if KMP_HANDLE_SIGNALS
137typedef void (*sig_func_t)(
int);
138static sig_func_t __kmp_sighldrs[NSIG];
139static int __kmp_siginstalled[NSIG];
143static HANDLE __kmp_monitor_ev;
152 InitializeCriticalSection(&mx->cs);
154 __kmp_itt_system_object_created(&mx->cs,
"Critical Section");
159 DeleteCriticalSection(&mx->cs);
163 EnterCriticalSection(&mx->cs);
167 return TryEnterCriticalSection(&mx->cs);
171 LeaveCriticalSection(&mx->cs);
175 cv->waiters_count_ = 0;
176 cv->wait_generation_count_ = 0;
177 cv->release_count_ = 0;
183 cv->event_ = CreateEvent(NULL,
188 __kmp_itt_system_object_created(cv->event_,
"Event");
195 memset(cv,
'\0',
sizeof(*cv));
211 cv->waiters_count_++;
214 my_generation = cv->wait_generation_count_;
221 DWORD
res, timeout = 5000;
223 res = WaitForSingleObject(cv->event_, timeout);
225 if (
res == WAIT_OBJECT_0) {
231 wait_done = (cv->release_count_ > 0) &&
232 (cv->wait_generation_count_ != my_generation);
234 }
else if (
res == WAIT_TIMEOUT ||
res == WAIT_FAILED) {
238 typename C::flag_t old_f =
flag->set_sleeping();
244 flag->unset_sleeping();
245 TCW_PTR(th->th.th_sleep_loc, NULL);
247 KF_TRACE(50, (
"__kmp_win32_cond_wait: exiting, condition "
248 "fulfilled: flag's loc(%p): %u\n",
249 flag->get(), (
unsigned int)
flag->load()));
253 cv->release_count_ = cv->waiters_count_;
254 cv->wait_generation_count_++;
269 cv->waiters_count_--;
270 cv->release_count_--;
272 last_waiter = (cv->release_count_ == 0);
278 ResetEvent(cv->event_);
285 if (cv->waiters_count_ > 0) {
286 SetEvent(cv->event_);
289 cv->release_count_ = cv->waiters_count_;
292 cv->wait_generation_count_++;
319 int new_value =
TRUE;
321 if (old_value == new_value)
324 if (old_value == -1 ||
364 typename C::flag_t old_spin;
366 KF_TRACE(30, (
"__kmp_suspend_template: T#%d enter for flag's loc(%p)\n",
367 th_gtid,
flag->get()));
372 KF_TRACE(10, (
"__kmp_suspend_template: T#%d setting sleep bit for flag's"
374 th_gtid,
flag->get()));
378 old_spin =
flag->set_sleeping();
380 th->th.th_sleep_loc_type =
flag->get_type();
383 flag->unset_sleeping();
384 TCW_PTR(th->th.th_sleep_loc, NULL);
390 KF_TRACE(5, (
"__kmp_suspend_template: T#%d set sleep bit for flag's"
392 th_gtid,
flag->get(), (
unsigned int)
flag->load()));
394 if (
flag->done_check_val(old_spin) ||
flag->done_check()) {
395 flag->unset_sleeping();
396 TCW_PTR(th->th.th_sleep_loc, NULL);
398 KF_TRACE(5, (
"__kmp_suspend_template: T#%d false alarm, reset sleep bit "
399 "for flag's loc(%p)\n",
400 th_gtid,
flag->get()));
403 __kmp_suspend_count++;
408 int deactivated =
FALSE;
410 while (
flag->is_sleeping()) {
411 KF_TRACE(15, (
"__kmp_suspend_template: T#%d about to perform "
412 "kmp_win32_cond_wait()\n",
417 th->th.th_active =
FALSE;
418 if (th->th.th_active_in_pool) {
419 th->th.th_active_in_pool =
FALSE;
433 if (
flag->is_sleeping()) {
435 (
"__kmp_suspend_template: T#%d spurious wakeup\n", th_gtid));
443 TCW_PTR(th->th.th_sleep_loc, NULL);
451 th->th.th_active =
TRUE;
452 if (
TCR_4(th->th.th_in_pool)) {
454 th->th.th_active_in_pool =
TRUE;
460 KF_TRACE(30, (
"__kmp_suspend_template: T#%d exit\n", th_gtid));
463template <
bool C,
bool S>
467template <
bool C,
bool S>
471template <
bool C,
bool S>
497 KF_TRACE(30, (
"__kmp_resume_template: T#%d wants to wakeup T#%d enter\n",
503 if (!
flag ||
flag != th->th.th_sleep_loc) {
506 flag = (
C *)th->th.th_sleep_loc;
511 if (!
flag ||
flag->get_type() != th->th.th_sleep_loc_type) {
513 KF_TRACE(5, (
"__kmp_resume_template: T#%d exiting, thread T#%d already "
514 "awake: flag's loc(%p)\n",
515 gtid, target_gtid, NULL));
519 if (!
flag->is_sleeping()) {
520 KF_TRACE(5, (
"__kmp_resume_template: T#%d exiting, thread T#%d already "
521 "awake: flag's loc(%p): %u\n",
522 gtid, target_gtid,
flag->get(), (
unsigned int)
flag->load()));
528 flag->unset_sleeping();
529 TCW_PTR(th->th.th_sleep_loc, NULL);
532 KF_TRACE(5, (
"__kmp_resume_template: T#%d about to wakeup T#%d, reset sleep "
533 "bit for flag's loc(%p)\n",
534 gtid, target_gtid,
flag->get()));
539 KF_TRACE(30, (
"__kmp_resume_template: T#%d exiting after signaling wake up"
544template <
bool C,
bool S>
548template <
bool C,
bool S>
552template <
bool C,
bool S>
570 KA_TRACE(50, (
"__kmp_gtid_set_specific: T#%d key:%d\n", gtid,
576 KA_TRACE(50, (
"__kmp_gtid_set_specific: runtime shutdown, returning\n"));
583 KA_TRACE(50, (
"__kmp_gtid_get_specific: runtime shutdown, returning "
584 "KMP_GTID_SHUTDOWN\n"));
593 KA_TRACE(50, (
"__kmp_gtid_get_specific: key:%d gtid:%d\n",
599 if (__kmp_num_proc_groups > 1) {
604 sizeof(DWORD_PTR))));
605 ga.Group = proc / (CHAR_BIT *
sizeof(DWORD_PTR));
606 ga.Mask = (
unsigned long long)1 << (proc % (CHAR_BIT *
sizeof(DWORD_PTR)));
607 ga.Reserved[0] = ga.Reserved[1] = ga.Reserved[2] = 0;
610 if (__kmp_SetThreadGroupAffinity(GetCurrentThread(), &ga, NULL) == 0) {
611 DWORD error = GetLastError();
613 if (__kmp_affinity.flags.verbose) {
623 kmp_affin_mask_t *
mask;
624 KMP_CPU_ALLOC_ON_STACK(
mask);
626 KMP_CPU_SET(proc,
mask);
627 __kmp_set_system_affinity(
mask,
TRUE);
628 KMP_CPU_FREE_FROM_STACK(
mask);
636#if KMP_GROUP_AFFINITY
637 KMP_AFFINITY_ENABLE(__kmp_num_proc_groups *
sizeof(DWORD_PTR));
639 KMP_AFFINITY_ENABLE(
sizeof(DWORD_PTR));
642 KA_TRACE(10, (
"__kmp_affinity_determine_capable: "
643 "Windows* OS affinity interface functional (mask size = "
644 "%" KMP_SIZE_T_SPEC
").\n",
645 __kmp_affin_mask_size));
649 FILETIME CreationTime, ExitTime, KernelTime, UserTime;
655 status = GetProcessTimes(GetCurrentProcess(), &CreationTime, &ExitTime,
656 &KernelTime, &UserTime);
661 sec += KernelTime.dwHighDateTime;
662 sec += UserTime.dwHighDateTime;
667 sec += KernelTime.dwLowDateTime;
668 sec += UserTime.dwLowDateTime;
702 UINT err_mode = SetErrorMode(SEM_FAILCRITICALERRORS);
704 BOOL
ret = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
705 GET_MODULE_HANDLE_EX_FLAG_PIN,
709 SetErrorMode(err_mode);
710 KA_TRACE(10, (
"__kmp_runtime_initialize: dynamic library pinned\n"));
720#if (KMP_ARCH_X86 || KMP_ARCH_X86_64)
721 if (!__kmp_cpuinfo.initialized) {
722 __kmp_query_cpuid(&__kmp_cpuinfo);
727#if KMP_OS_WINDOWS && !KMP_DYNAMIC_LIB
760 path_size = GetSystemDirectory(
path.str,
path.size);
762 if (path_size >=
path.size) {
765 path_size = GetSystemDirectory(
path.str,
path.size);
768 if (path_size > 0 && path_size <
path.size) {
771 path.used = path_size;
781 ntdll,
"NtQuerySystemInformation");
785#if KMP_GROUP_AFFINITY
788 if (path_size > 0 && path_size <
path.size) {
791 path.used = path_size;
796 KA_TRACE(10, (
"__kmp_runtime_initialize: kernel32.dll = %s\n",
path.str));
801 __kmp_GetActiveProcessorCount =
802 (kmp_GetActiveProcessorCount_t)GetProcAddress(
803 kernel32,
"GetActiveProcessorCount");
804 __kmp_GetActiveProcessorGroupCount =
805 (kmp_GetActiveProcessorGroupCount_t)GetProcAddress(
806 kernel32,
"GetActiveProcessorGroupCount");
807 __kmp_GetThreadGroupAffinity =
808 (kmp_GetThreadGroupAffinity_t)GetProcAddress(
809 kernel32,
"GetThreadGroupAffinity");
810 __kmp_SetThreadGroupAffinity =
811 (kmp_SetThreadGroupAffinity_t)GetProcAddress(
812 kernel32,
"SetThreadGroupAffinity");
814 KA_TRACE(10, (
"__kmp_runtime_initialize: __kmp_GetActiveProcessorCount"
816 __kmp_GetActiveProcessorCount));
817 KA_TRACE(10, (
"__kmp_runtime_initialize: "
818 "__kmp_GetActiveProcessorGroupCount = %p\n",
819 __kmp_GetActiveProcessorGroupCount));
820 KA_TRACE(10, (
"__kmp_runtime_initialize:__kmp_GetThreadGroupAffinity"
822 __kmp_GetThreadGroupAffinity));
823 KA_TRACE(10, (
"__kmp_runtime_initialize: __kmp_SetThreadGroupAffinity"
825 __kmp_SetThreadGroupAffinity));
826 KA_TRACE(10, (
"__kmp_runtime_initialize: sizeof(kmp_affin_mask_t) = %d\n",
827 sizeof(kmp_affin_mask_t)));
834 if ((__kmp_GetActiveProcessorCount != NULL) &&
835 (__kmp_GetActiveProcessorGroupCount != NULL) &&
836 (__kmp_GetThreadGroupAffinity != NULL) &&
837 (__kmp_SetThreadGroupAffinity != NULL) &&
838 ((__kmp_num_proc_groups = __kmp_GetActiveProcessorGroupCount()) >
843 KA_TRACE(10, (
"__kmp_runtime_initialize: %d processor groups"
845 __kmp_num_proc_groups));
849 for (
i = 0;
i < __kmp_num_proc_groups;
i++) {
850 DWORD
size = __kmp_GetActiveProcessorCount(
i);
852 KA_TRACE(10, (
"__kmp_runtime_initialize: proc group %d size = %d\n",
856 KA_TRACE(10, (
"__kmp_runtime_initialize: %d processor groups"
858 __kmp_num_proc_groups));
862 if (__kmp_num_proc_groups <= 1) {
863 GetSystemInfo(&info);
868 GetSystemInfo(&info);
879 (
"__kmp_runtime_initialize: total processors = %d\n",
__kmp_xproc));
884 __kmp_itt_initialize();
901 KA_TRACE(40, (
"__kmp_runtime_destroy\n"));
908 __kmp_affinity_uninitialize();
916 __kmp_GetActiveProcessorCount = NULL;
917 __kmp_GetActiveProcessorGroupCount = NULL;
918 __kmp_GetThreadGroupAffinity = NULL;
919 __kmp_SetThreadGroupAffinity = NULL;
931 KA_TRACE(10, (
"__kmp_terminate_thread: kill (%d)\n", gtid));
933 if (TerminateThread(th->th.th_info.ds.ds_thread, (DWORD)-1) ==
FALSE) {
941 QueryPerformanceCounter(&time);
950 status = QueryPerformanceFrequency(&freq);
952 DWORD error = GetLastError();
966 QueryPerformanceCounter(&now);
977 QueryPerformanceCounter(&now);
986 QueryPerformanceCounter(&now);
991 volatile void *stack_data;
997 gtid = this_thr->th.th_info.ds.ds_gtid;
1000#error "This define causes problems with LoadLibrary() + declspec(thread) " \
1001 "on Windows* OS. See CQ50564, tests kmp_load_library*.c and this MSDN " \
1002 "reference: http://support.microsoft.com/kb/118816"
1007 __kmp_itt_thread_name(gtid);
1010 __kmp_affinity_bind_init_mask(gtid);
1012#if KMP_ARCH_X86 || KMP_ARCH_X86_64
1014 __kmp_clear_x87_fpu_status_word();
1015 __kmp_load_x87_fpu_control_word(&__kmp_init_x87_fpu_control_word);
1016 __kmp_load_mxcsr(&__kmp_init_mxcsr);
1025 this_thr->th.th_info.ds.ds_thread_id = GetCurrentThreadId();
1026 TCW_4(this_thr->th.th_info.ds.ds_alive,
TRUE);
1030 TCW_PTR(this_thr->th.th_info.ds.ds_stackbase, &stack_data);
1037 TCW_4(this_thr->th.th_info.ds.ds_alive,
FALSE);
1045void *__stdcall __kmp_launch_monitor(
void *arg) {
1047 kmp_thread_t monitor;
1053 TCW_4(__kmp_init_monitor, 2);
1055 this_thr->th.th_info.ds.ds_thread_id = GetCurrentThreadId();
1056 TCW_4(this_thr->th.th_info.ds.ds_alive,
TRUE);
1059 KA_TRACE(10, (
"__kmp_launch_monitor: launched\n"));
1061 monitor = GetCurrentThread();
1064 status = SetThreadPriority(monitor, THREAD_PRIORITY_HIGHEST);
1066 DWORD
error = GetLastError();
1072#ifdef KMP_TDATA_GTID
1073#error "This define causes problems with LoadLibrary() + declspec(thread) " \
1074 "on Windows* OS. See CQ50564, tests kmp_load_library*.c and this MSDN " \
1075 "reference: http://support.microsoft.com/kb/118816"
1080 __kmp_itt_thread_ignore();
1086 interval = (1000 / __kmp_monitor_wakeups);
1091 KA_TRACE(15, (
"__kmp_launch_monitor: update\n"));
1093 wait_status = WaitForSingleObject(__kmp_monitor_ev, interval);
1095 if (wait_status == WAIT_TIMEOUT) {
1103 KA_TRACE(10, (
"__kmp_launch_monitor: finished\n"));
1105 status = SetThreadPriority(monitor, THREAD_PRIORITY_NORMAL);
1107 DWORD
error = GetLastError();
1116 KA_TRACE(10, (
"__kmp_launch_monitor: terminate sig=%d\n",
1130 (
"__kmp_launch_monitor: raise sig=%d\n",
__kmp_global.g.g_abort));
1137 TCW_4(this_thr->th.th_info.ds.ds_alive,
FALSE);
1145 kmp_thread_t handle;
1148 KA_TRACE(10, (
"__kmp_create_worker: try to create thread (%d)\n", gtid));
1150 th->th.th_info.ds.ds_gtid = gtid;
1160 rc = DuplicateHandle(GetCurrentProcess(), GetCurrentThread(),
1161 GetCurrentProcess(), &th->th.th_info.ds.ds_thread, 0,
1162 FALSE, DUPLICATE_SAME_ACCESS);
1164 KA_TRACE(10, (
" __kmp_create_worker: ROOT Handle duplicated, th = %p, "
1166 (LPVOID)th, th->th.th_info.ds.ds_thread));
1167 th->th.th_info.ds.ds_thread_id = GetCurrentThreadId();
1171 TCW_PTR(th->th.th_info.ds.ds_stackbase, &stack_data);
1172 TCW_PTR(th->th.th_info.ds.ds_stacksize, 0);
1173 TCW_4(th->th.th_info.ds.ds_stackgrow,
TRUE);
1181 (
"__kmp_create_worker: stack_size = %" KMP_SIZE_T_SPEC
" bytes\n",
1186 TCW_PTR(th->th.th_info.ds.ds_stacksize, stack_size);
1187 TCW_4(th->th.th_info.ds.ds_stackgrow,
FALSE);
1190 (
"__kmp_create_worker: (before) stack_size = %" KMP_SIZE_T_SPEC
1191 " bytes, &__kmp_launch_worker = %p, th = %p, &idThread = %p\n",
1193 (LPVOID)th, &idThread));
1195 handle = CreateThread(
1197 (LPVOID)th, STACK_SIZE_PARAM_IS_A_RESERVATION, &idThread);
1200 (
"__kmp_create_worker: (after) stack_size = %" KMP_SIZE_T_SPEC
1201 " bytes, &__kmp_launch_worker = %p, th = %p, "
1204 (LPVOID)th, idThread, handle));
1207 DWORD error = GetLastError();
1210 th->th.th_info.ds.ds_thread = handle;
1216 KA_TRACE(10, (
"__kmp_create_worker: done creating thread (%d)\n", gtid));
1220 return (WAIT_TIMEOUT == WaitForSingleObject(th->th.th_info.ds.ds_thread, 0));
1225 kmp_thread_t handle;
1227 int ideal, new_ideal;
1231 KA_TRACE(10, (
"__kmp_create_monitor: skipping monitor thread because of "
1232 "MAX blocktime\n"));
1233 th->th.th_info.ds.ds_tid = 0;
1234 th->th.th_info.ds.ds_gtid = 0;
1235 TCW_4(__kmp_init_monitor, 2);
1238 KA_TRACE(10, (
"__kmp_create_monitor: try to create monitor\n"));
1242 __kmp_monitor_ev = CreateEvent(NULL,
TRUE,
FALSE, NULL);
1243 if (__kmp_monitor_ev == NULL) {
1244 DWORD
error = GetLastError();
1248 __kmp_itt_system_object_created(__kmp_monitor_ev,
"Event");
1256 if (__kmp_monitor_stksize == 0) {
1257 __kmp_monitor_stksize = KMP_DEFAULT_MONITOR_STKSIZE;
1263 KA_TRACE(10, (
"__kmp_create_monitor: requested stacksize = %d bytes\n",
1264 (
int)__kmp_monitor_stksize));
1269 CreateThread(NULL, (SIZE_T)__kmp_monitor_stksize,
1270 (LPTHREAD_START_ROUTINE)__kmp_launch_monitor, (LPVOID)th,
1271 STACK_SIZE_PARAM_IS_A_RESERVATION, &idThread);
1273 DWORD
error = GetLastError();
1276 th->th.th_info.ds.ds_thread = handle;
1280 KA_TRACE(10, (
"__kmp_create_monitor: monitor created %p\n",
1281 (
void *)th->th.th_info.ds.ds_thread));
1293 rc = GetExitCodeThread(th->th.th_info.ds.ds_thread, exit_val);
1295 DWORD error = GetLastError();
1299 return (*exit_val == STILL_ACTIVE);
1303 ExitThread(exit_status);
1313 10, (
"__kmp_reap_common: try to reap (%d)\n", th->th.th_info.ds.ds_gtid));
1341 }
while (exit_val == STILL_ACTIVE &&
TCR_4(th->th.th_info.ds.ds_alive));
1343 if (exit_val == STILL_ACTIVE) {
1357 if (exit_val == STILL_ACTIVE) {
1358 KA_TRACE(1, (
"__kmp_reap_common: thread still active.\n"));
1359 }
else if ((
void *)e != (
void *)th) {
1360 KA_TRACE(1, (
"__kmp_reap_common: ExitProcess / TerminateThread used?\n"));
1366 th->th.th_info.ds.ds_gtid, th->th.th_info.ds.ds_thread));
1368 th->th.th_info.ds.ds_thread = 0;
1371 th->th.th_info.ds.ds_thread_id = 0;
1380 KA_TRACE(10, (
"__kmp_reap_monitor: try to reap %p\n",
1381 (
void *)th->th.th_info.ds.ds_thread));
1388 KA_TRACE(10, (
"__kmp_reap_monitor: monitor did not start, returning\n"));
1394 status = SetEvent(__kmp_monitor_ev);
1396 DWORD
error = GetLastError();
1399 KA_TRACE(10, (
"__kmp_reap_monitor: reaping thread (%d)\n",
1400 th->th.th_info.ds.ds_gtid));
1410 KA_TRACE(10, (
"__kmp_reap_worker: reaping thread (%d)\n",
1411 th->th.th_info.ds.ds_gtid));
1415#if KMP_HANDLE_SIGNALS
1417static void __kmp_team_handler(
int signo) {
1431static sig_func_t __kmp_signal(
int signum, sig_func_t handler) {
1432 sig_func_t old = signal(signum, handler);
1433 if (old == SIG_ERR) {
1441static void __kmp_install_one_handler(
int sig, sig_func_t handler,
1442 int parallel_init) {
1445 KB_TRACE(60, (
"__kmp_install_one_handler: called: sig=%d\n", sig));
1446 if (parallel_init) {
1447 old = __kmp_signal(sig, handler);
1449 if (old == __kmp_sighldrs[sig]) {
1450 __kmp_siginstalled[sig] = 1;
1452 old = __kmp_signal(sig, old);
1458 old = __kmp_signal(sig, SIG_DFL);
1459 __kmp_sighldrs[sig] = old;
1460 __kmp_signal(sig, old);
1465static void __kmp_remove_one_handler(
int sig) {
1466 if (__kmp_siginstalled[sig]) {
1469 KB_TRACE(60, (
"__kmp_remove_one_handler: called: sig=%d\n", sig));
1470 old = __kmp_signal(sig, __kmp_sighldrs[sig]);
1471 if (old != __kmp_team_handler) {
1472 KB_TRACE(10, (
"__kmp_remove_one_handler: oops, not our handler, "
1473 "restoring: sig=%d\n",
1475 old = __kmp_signal(sig, old);
1477 __kmp_sighldrs[sig] = NULL;
1478 __kmp_siginstalled[sig] = 0;
1483void __kmp_install_signals(
int parallel_init) {
1484 KB_TRACE(10, (
"__kmp_install_signals: called\n"));
1485 if (!__kmp_handle_signals) {
1486 KB_TRACE(10, (
"__kmp_install_signals: KMP_HANDLE_SIGNALS is false - "
1487 "handlers not installed\n"));
1490 __kmp_install_one_handler(SIGINT, __kmp_team_handler, parallel_init);
1491 __kmp_install_one_handler(SIGILL, __kmp_team_handler, parallel_init);
1492 __kmp_install_one_handler(SIGABRT, __kmp_team_handler, parallel_init);
1493 __kmp_install_one_handler(SIGFPE, __kmp_team_handler, parallel_init);
1494 __kmp_install_one_handler(SIGSEGV, __kmp_team_handler, parallel_init);
1495 __kmp_install_one_handler(SIGTERM, __kmp_team_handler, parallel_init);
1498void __kmp_remove_signals(
void) {
1500 KB_TRACE(10, (
"__kmp_remove_signals: called\n"));
1501 for (sig = 1; sig < NSIG; ++sig) {
1502 __kmp_remove_one_handler(sig);
1514 DWORD error = GetLastError();
1522 MEMORY_BASIC_INFORMATION lpBuffer;
1525 dwLength =
sizeof(MEMORY_BASIC_INFORMATION);
1527 VirtualQuery(
addr, &lpBuffer, dwLength);
1529 return !(((lpBuffer.State == MEM_RESERVE) || (lpBuffer.State == MEM_FREE)) ||
1530 ((lpBuffer.Protect == PAGE_NOACCESS) ||
1531 (lpBuffer.Protect == PAGE_EXECUTE)));
1537 QueryPerformanceCounter((LARGE_INTEGER *)&
r);
1546 rc = CloseHandle(tHandle);
1548 DWORD error = GetLastError();
1554 static ULONG glb_buff_size = 100 * 1024;
1557 static int glb_running_threads = 0;
1558 static double glb_call_time = 0;
1560 int running_threads = 0;
1562 ULONG buff_size = 0;
1563 ULONG info_size = 0;
1564 void *buffer = NULL;
1568 double call_time = 0.0;
1572 if (glb_call_time &&
1573 (call_time - glb_call_time < __kmp_load_balance_interval)) {
1574 running_threads = glb_running_threads;
1577 glb_call_time = call_time;
1581 running_threads = -1;
1592 buff_size = glb_buff_size;
1594 buff_size = 2 * buff_size;
1598 if (buffer == NULL) {
1599 running_threads = -1;
1603 buff_size, &info_size);
1606 }
while (
status == STATUS_INFO_LENGTH_MISMATCH);
1607 glb_buff_size = buff_size;
1609#define CHECK(cond) \
1611 KMP_DEBUG_ASSERT(cond); \
1613 running_threads = -1; \
1618 CHECK(buff_size >= info_size);
1621 ptrdiff_t offset = uintptr_t(spi) - uintptr_t(buffer);
1622 CHECK(0 <= offset &&
1629 CHECK(offset + spi_size <
1639 for (ULONG
i = 0;
i < num; ++
i) {
1647 if (running_threads >= max) {
1663 if (buffer != NULL) {
1667 glb_running_threads = running_threads;
1669 return running_threads;
1674 HANDLE process = GetCurrentProcess();
1676 HMODULE *modules =
nullptr;
1677 if (!EnumProcessModules(process, modules, 0, &needed))
1679 DWORD num_modules = needed /
sizeof(HMODULE);
1680 modules = (HMODULE *)malloc(num_modules *
sizeof(HMODULE));
1681 if (!EnumProcessModules(process, modules, needed, &needed)) {
1685 HMODULE curr_module =
nullptr;
1688 if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
1694 void *proc =
nullptr;
1695 for (uint32_t
i = 0;
i < num_modules;
i++) {
1696 if (next && modules[
i] == curr_module)
1698 proc = (
void *)GetProcAddress(modules[
i],
name);
1708 KMP_ASSERT(0 &&
"Hidden helper task is not supported on Windows");
1712 KMP_ASSERT(0 &&
"Hidden helper task is not supported on Windows");
1716 KMP_ASSERT(0 &&
"Hidden helper task is not supported on Windows");
1720 KMP_ASSERT(0 &&
"Hidden helper task is not supported on Windows");
1724 KMP_ASSERT(0 &&
"Hidden helper task is not supported on Windows");
1728 KMP_ASSERT(0 &&
"Hidden helper task is not supported on Windows");
1732 KMP_ASSERT(0 &&
"Hidden helper task is not supported on Windows");
1736 KMP_ASSERT(0 &&
"Hidden helper task is not supported on Windows");
1740 KMP_ASSERT(0 &&
"Hidden helper task is not supported on Windows");
__itt_string_handle * name
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int mask
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d __itt_event ITT_FORMAT __itt_group_mark d void const wchar_t const wchar_t int ITT_FORMAT __itt_group_sync __itt_group_fsync x void const wchar_t int const wchar_t int int ITT_FORMAT __itt_group_sync __itt_group_fsync x void ITT_FORMAT __itt_group_sync __itt_group_fsync p void ITT_FORMAT __itt_group_sync __itt_group_fsync p void size_t ITT_FORMAT lu no args __itt_obj_prop_t __itt_obj_state_t ITT_FORMAT d const char ITT_FORMAT s const char ITT_FORMAT s __itt_frame ITT_FORMAT p __itt_counter ITT_FORMAT p __itt_counter unsigned long long ITT_FORMAT lu __itt_counter unsigned long long ITT_FORMAT lu __itt_counter __itt_clock_domain unsigned long long void ITT_FORMAT p const wchar_t ITT_FORMAT S __itt_mark_type const wchar_t ITT_FORMAT S __itt_mark_type const char ITT_FORMAT s __itt_mark_type ITT_FORMAT d __itt_caller ITT_FORMAT p __itt_caller ITT_FORMAT p no args const __itt_domain __itt_clock_domain unsigned long long __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_id void ITT_FORMAT p const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_string_handle __itt_scope ITT_FORMAT d const __itt_domain __itt_scope __itt_string_handle const char size_t ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_relation __itt_id ITT_FORMAT lu __itt_track_group __itt_string_handle __itt_track_group_type ITT_FORMAT d __itt_track ITT_FORMAT p void int const int int const char int ITT_FORMAT d void void const char * path
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d int
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function h
int __kmp_generate_warnings
kmp_global_t __kmp_global
#define KMP_YIELD_OVERSUB_ELSE_SPIN(count, time)
kmp_pause_status_t __kmp_pause_status
#define KMP_MAX_BLOCKTIME
void __kmp_check_stack_overlap(kmp_info_t *thr)
#define KMP_INTERNAL_REALLOC(p, sz)
volatile int __kmp_init_gtid
#define KMP_GTID_SHUTDOWN
#define KMP_BARRIER_SLEEP_STATE
static bool KMP_UBER_GTID(int gtid)
std::atomic< int > __kmp_thread_pool_active_nth
void * __kmp_launch_thread(kmp_info_t *thr)
kmp_info_t ** __kmp_threads
#define KMP_INIT_YIELD(count)
#define KMP_INIT_BACKOFF(time)
kmp_key_t __kmp_gtid_threadprivate_key
size_t __kmp_sys_min_stksize
#define KMP_INTERNAL_FREE(p)
int __kmp_threads_capacity
void __kmp_serial_initialize(void)
union KMP_ALIGN_CACHE kmp_info kmp_info_t
KMP_ARCH_X86 KMP_ARCH_X86 long double
void __kmp_dump_debug_buffer(void)
#define KMP_BUILD_ASSERT(expr)
#define KMP_DEBUG_ASSERT2(cond, msg)
#define KMP_DEBUG_ASSERT(cond)
unsigned long long kmp_uint64
static volatile kmp_i18n_cat_status_t status
static void __kmp_msg(kmp_msg_severity_t severity, kmp_msg_t message, va_list ap)
void __kmp_fatal(kmp_msg_t message,...)
#define KMP_FSYNC_RELEASING(obj)
#define KMP_FSYNC_SPIN_ACQUIRED(obj)
#define KMP_FSYNC_CANCEL(obj)
#define KMP_FSYNC_SPIN_PREPARE(obj)
#define KMP_FSYNC_SPIN_INIT(obj, spin)
#define KMP_ATOMIC_ST_REL(p, v)
bool __kmp_atomic_compare_store(std::atomic< T > *p, T expected, T desired)
#define KMP_ATOMIC_LD_ACQ(p)
#define KMP_ATOMIC_DEC(p)
#define KMP_ATOMIC_LD_RLX(p)
#define KMP_ATOMIC_INC(p)
void __kmp_str_buf_reserve(kmp_str_buf_t *buffer, size_t size)
void __kmp_str_buf_free(kmp_str_buf_t *buffer)
int __kmp_str_buf_print(kmp_str_buf_t *buffer, char const *format,...)
void __kmp_str_free(char **str)
#define __kmp_str_buf_init(b)
SIZE_T PeakWorkingSetSize
SIZE_T QuotaNonPagedPoolUsage
SIZE_T QuotaPeakPagedPoolUsage
SIZE_T QuotaPeakNonPagedPoolUsage
SIZE_T QuotaPagedPoolUsage
void __kmp_reap_monitor(kmp_info_t *th)
void __kmp_win32_mutex_unlock(kmp_win32_mutex_t *mx)
void __kmp_free_handle(kmp_thread_t tHandle)
void __kmp_win32_cond_init(kmp_win32_cond_t *cv)
void __kmp_hidden_helper_worker_thread_signal()
template void __kmp_atomic_resume_64< false, true >(int, kmp_atomic_flag_64< false, true > *)
template void __kmp_suspend_64< true, false >(int, kmp_flag_64< true, false > *)
void __kmp_win32_mutex_lock(kmp_win32_mutex_t *mx)
void __kmp_read_system_time(double *delta)
void __kmp_hidden_helper_threads_initz_wait()
SYSTEM_PROCESS_INFORMATION * PSYSTEM_PROCESS_INFORMATION
static void __kmp_suspend_template(int th_gtid, C *flag)
CRITICAL_SECTION __kmp_win32_section
void __kmp_affinity_determine_capable(const char *env_var)
void __kmp_enable(int new_state)
void __kmp_unlock_suspend_mx(kmp_info_t *th)
void __kmp_affinity_bind_thread(int proc)
void __kmp_do_initialize_hidden_helper_threads()
int __kmp_get_load_balance(int max)
void __kmp_thread_sleep(int millis)
void __kmp_win32_cond_broadcast(kmp_win32_cond_t *cv)
void * __kmp_lookup_symbol(const char *name, bool next)
void __kmp_suspend_64(int th_gtid, kmp_flag_64< C, S > *flag)
int __kmp_still_running(kmp_info_t *th)
void __kmp_hidden_helper_main_thread_release()
template void __kmp_resume_32< false, false >(int, kmp_flag_32< false, false > *)
void __kmp_suspend_initialize(void)
kmp_uint64 __kmp_now_nsec()
int __kmp_is_address_mapped(void *addr)
NtQuerySystemInformation_t NtQuerySystemInformation
double __kmp_read_cpu_time(void)
void __kmp_suspend_32(int th_gtid, kmp_flag_32< C, S > *flag)
void __kmp_hidden_helper_worker_thread_wait()
void __kmp_initialize_system_tick(void)
template void __kmp_resume_32< false, true >(int, kmp_flag_32< false, true > *)
@ SystemProcessInformation
void __kmp_disable(int *old_state)
void __kmp_win32_cond_signal(kmp_win32_cond_t *cv)
void __kmp_win32_cond_destroy(kmp_win32_cond_t *cv)
template void __kmp_atomic_suspend_64< true, false >(int, kmp_atomic_flag_64< true, false > *)
void __kmp_hidden_helper_threads_deinitz_wait()
void *__stdcall __kmp_launch_worker(void *arg)
template void __kmp_atomic_suspend_64< false, true >(int, kmp_atomic_flag_64< false, true > *)
int __kmp_gtid_get_specific()
void __kmp_hidden_helper_main_thread_wait()
void __kmp_hidden_helper_initz_release()
void __kmp_suspend_uninitialize_thread(kmp_info_t *th)
void __kmp_suspend_oncore(int th_gtid, kmp_flag_oncore *flag)
void __kmp_lock_suspend_mx(kmp_info_t *th)
void __kmp_terminate_thread(int gtid)
void __kmp_create_worker(int gtid, kmp_info_t *th, size_t stack_size)
template void __kmp_resume_64< false, true >(int, kmp_flag_64< false, true > *)
void __kmp_elapsed(double *t)
void __kmp_clear_system_time(void)
static void __kmp_reap_common(kmp_info_t *th)
int __kmp_win32_mutex_trylock(kmp_win32_mutex_t *mx)
template void __kmp_suspend_64< false, true >(int, kmp_flag_64< false, true > *)
static void __kmp_resume_template(int target_gtid, C *flag)
void __kmp_runtime_destroy(void)
int __kmp_read_system_info(struct kmp_sys_info *info)
void __kmp_win32_mutex_init(kmp_win32_mutex_t *mx)
template void __kmp_suspend_32< false, false >(int, kmp_flag_32< false, false > *)
static void __kmp_win32_cond_wait(kmp_win32_cond_t *cv, kmp_win32_mutex_t *mx, kmp_info_t *th, C *flag)
void __kmp_resume_oncore(int target_gtid, kmp_flag_oncore *flag)
void __kmp_runtime_initialize(void)
NTSTATUS(NTAPI * NtQuerySystemInformation_t)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG)
int __kmp_try_suspend_mx(kmp_info_t *th)
int __kmp_is_thread_alive(kmp_info_t *th, DWORD *exit_val)
void __kmp_resume_64(int target_gtid, kmp_flag_64< C, S > *flag)
void __kmp_resume_32(int target_gtid, kmp_flag_32< C, S > *flag)
void __kmp_atomic_suspend_64(int th_gtid, kmp_atomic_flag_64< C, S > *flag)
void __kmp_elapsed_tick(double *t)
void __kmp_gtid_set_specific(int gtid)
void __kmp_atomic_resume_64(int target_gtid, kmp_atomic_flag_64< C, S > *flag)
void __kmp_win32_mutex_destroy(kmp_win32_mutex_t *mx)
void __kmp_suspend_initialize_thread(kmp_info_t *th)
void __kmp_exit_thread(int exit_status)
void __kmp_reap_worker(kmp_info_t *th)
void __kmp_hidden_helper_threads_deinitz_release()
static kmp_int64 __kmp_win32_time
kmp_uint64 __kmp_hardware_timestamp(void)