1 /*
2  * z_Linux_util.cpp -- platform specific routines.
3  */
4 
5 //===----------------------------------------------------------------------===//
6 //
7 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8 // See https://llvm.org/LICENSE.txt for license information.
9 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "kmp.h"
14 #include "kmp_affinity.h"
15 #include "kmp_i18n.h"
16 #include "kmp_io.h"
17 #include "kmp_itt.h"
18 #include "kmp_lock.h"
19 #include "kmp_stats.h"
20 #include "kmp_str.h"
21 #include "kmp_wait_release.h"
22 #include "kmp_wrapper_getpid.h"
23 
24 #if !KMP_OS_DRAGONFLY && !KMP_OS_FREEBSD && !KMP_OS_NETBSD && !KMP_OS_OPENBSD
25 #include <alloca.h>
26 #endif
27 #include <math.h> // HUGE_VAL.
28 #include <sys/resource.h>
29 #include <sys/syscall.h>
30 #include <sys/time.h>
31 #include <sys/times.h>
32 #include <unistd.h>
33 
34 #if KMP_OS_LINUX && !KMP_OS_CNK
35 #include <sys/sysinfo.h>
36 #if KMP_USE_FUTEX
37 // We should really include <futex.h>, but that causes compatibility problems on
38 // different Linux* OS distributions that either require that you include (or
39 // break when you try to include) <pci/types.h>. Since all we need is the two
40 // macros below (which are part of the kernel ABI, so can't change) we just
41 // define the constants here and don't include <futex.h>
42 #ifndef FUTEX_WAIT
43 #define FUTEX_WAIT 0
44 #endif
45 #ifndef FUTEX_WAKE
46 #define FUTEX_WAKE 1
47 #endif
48 #endif
49 #elif KMP_OS_DARWIN
50 #include <mach/mach.h>
51 #include <sys/sysctl.h>
52 #elif KMP_OS_DRAGONFLY || KMP_OS_FREEBSD
53 #include <pthread_np.h>
54 #elif KMP_OS_NETBSD
55 #include <sys/types.h>
56 #include <sys/sysctl.h>
57 #endif
58 
59 #include <ctype.h>
60 #include <dirent.h>
61 #include <fcntl.h>
62 
63 #include "tsan_annotations.h"
64 
65 struct kmp_sys_timer {
66   struct timespec start;
67 };
68 
69 // Convert timespec to nanoseconds.
70 #define TS2NS(timespec) (((timespec).tv_sec * 1e9) + (timespec).tv_nsec)
71 
72 static struct kmp_sys_timer __kmp_sys_timer_data;
73 
74 #if KMP_HANDLE_SIGNALS
75 typedef void (*sig_func_t)(int);
76 STATIC_EFI2_WORKAROUND struct sigaction __kmp_sighldrs[NSIG];
77 static sigset_t __kmp_sigset;
78 #endif
79 
80 static int __kmp_init_runtime = FALSE;
81 
82 static int __kmp_fork_count = 0;
83 
84 static pthread_condattr_t __kmp_suspend_cond_attr;
85 static pthread_mutexattr_t __kmp_suspend_mutex_attr;
86 
87 static kmp_cond_align_t __kmp_wait_cv;
88 static kmp_mutex_align_t __kmp_wait_mx;
89 
90 kmp_uint64 __kmp_ticks_per_msec = 1000000;
91 
92 #ifdef DEBUG_SUSPEND
93 static void __kmp_print_cond(char *buffer, kmp_cond_align_t *cond) {
94   KMP_SNPRINTF(buffer, 128, "(cond (lock (%ld, %d)), (descr (%p)))",
95                cond->c_cond.__c_lock.__status, cond->c_cond.__c_lock.__spinlock,
96                cond->c_cond.__c_waiting);
97 }
98 #endif
99 
100 #if (KMP_OS_LINUX && KMP_AFFINITY_SUPPORTED)
101 
102 /* Affinity support */
103 
104 void __kmp_affinity_bind_thread(int which) {
105   KMP_ASSERT2(KMP_AFFINITY_CAPABLE(),
106               "Illegal set affinity operation when not capable");
107 
108   kmp_affin_mask_t *mask;
109   KMP_CPU_ALLOC_ON_STACK(mask);
110   KMP_CPU_ZERO(mask);
111   KMP_CPU_SET(which, mask);
112   __kmp_set_system_affinity(mask, TRUE);
113   KMP_CPU_FREE_FROM_STACK(mask);
114 }
115 
116 /* Determine if we can access affinity functionality on this version of
117  * Linux* OS by checking __NR_sched_{get,set}affinity system calls, and set
118  * __kmp_affin_mask_size to the appropriate value (0 means not capable). */
119 void __kmp_affinity_determine_capable(const char *env_var) {
120 // Check and see if the OS supports thread affinity.
121 
122 #define KMP_CPU_SET_SIZE_LIMIT (1024 * 1024)
123 
124   int gCode;
125   int sCode;
126   unsigned char *buf;
127   buf = (unsigned char *)KMP_INTERNAL_MALLOC(KMP_CPU_SET_SIZE_LIMIT);
128 
129   // If Linux* OS:
130   // If the syscall fails or returns a suggestion for the size,
131   // then we don't have to search for an appropriate size.
132   gCode = syscall(__NR_sched_getaffinity, 0, KMP_CPU_SET_SIZE_LIMIT, buf);
133   KA_TRACE(30, ("__kmp_affinity_determine_capable: "
134                 "initial getaffinity call returned %d errno = %d\n",
135                 gCode, errno));
136 
137   // if ((gCode < 0) && (errno == ENOSYS))
138   if (gCode < 0) {
139     // System call not supported
140     if (__kmp_affinity_verbose ||
141         (__kmp_affinity_warnings && (__kmp_affinity_type != affinity_none) &&
142          (__kmp_affinity_type != affinity_default) &&
143          (__kmp_affinity_type != affinity_disabled))) {
144       int error = errno;
145       kmp_msg_t err_code = KMP_ERR(error);
146       __kmp_msg(kmp_ms_warning, KMP_MSG(GetAffSysCallNotSupported, env_var),
147                 err_code, __kmp_msg_null);
148       if (__kmp_generate_warnings == kmp_warnings_off) {
149         __kmp_str_free(&err_code.str);
150       }
151     }
152     KMP_AFFINITY_DISABLE();
153     KMP_INTERNAL_FREE(buf);
154     return;
155   }
156   if (gCode > 0) { // Linux* OS only
157     // The optimal situation: the OS returns the size of the buffer it expects.
158     //
159     // A verification of correct behavior is that Isetaffinity on a NULL
160     // buffer with the same size fails with errno set to EFAULT.
161     sCode = syscall(__NR_sched_setaffinity, 0, gCode, NULL);
162     KA_TRACE(30, ("__kmp_affinity_determine_capable: "
163                   "setaffinity for mask size %d returned %d errno = %d\n",
164                   gCode, sCode, errno));
165     if (sCode < 0) {
166       if (errno == ENOSYS) {
167         if (__kmp_affinity_verbose ||
168             (__kmp_affinity_warnings &&
169              (__kmp_affinity_type != affinity_none) &&
170              (__kmp_affinity_type != affinity_default) &&
171              (__kmp_affinity_type != affinity_disabled))) {
172           int error = errno;
173           kmp_msg_t err_code = KMP_ERR(error);
174           __kmp_msg(kmp_ms_warning, KMP_MSG(SetAffSysCallNotSupported, env_var),
175                     err_code, __kmp_msg_null);
176           if (__kmp_generate_warnings == kmp_warnings_off) {
177             __kmp_str_free(&err_code.str);
178           }
179         }
180         KMP_AFFINITY_DISABLE();
181         KMP_INTERNAL_FREE(buf);
182       }
183       if (errno == EFAULT) {
184         KMP_AFFINITY_ENABLE(gCode);
185         KA_TRACE(10, ("__kmp_affinity_determine_capable: "
186                       "affinity supported (mask size %d)\n",
187                       (int)__kmp_affin_mask_size));
188         KMP_INTERNAL_FREE(buf);
189         return;
190       }
191     }
192   }
193 
194   // Call the getaffinity system call repeatedly with increasing set sizes
195   // until we succeed, or reach an upper bound on the search.
196   KA_TRACE(30, ("__kmp_affinity_determine_capable: "
197                 "searching for proper set size\n"));
198   int size;
199   for (size = 1; size <= KMP_CPU_SET_SIZE_LIMIT; size *= 2) {
200     gCode = syscall(__NR_sched_getaffinity, 0, size, buf);
201     KA_TRACE(30, ("__kmp_affinity_determine_capable: "
202                   "getaffinity for mask size %d returned %d errno = %d\n",
203                   size, gCode, errno));
204 
205     if (gCode < 0) {
206       if (errno == ENOSYS) {
207         // We shouldn't get here
208         KA_TRACE(30, ("__kmp_affinity_determine_capable: "
209                       "inconsistent OS call behavior: errno == ENOSYS for mask "
210                       "size %d\n",
211                       size));
212         if (__kmp_affinity_verbose ||
213             (__kmp_affinity_warnings &&
214              (__kmp_affinity_type != affinity_none) &&
215              (__kmp_affinity_type != affinity_default) &&
216              (__kmp_affinity_type != affinity_disabled))) {
217           int error = errno;
218           kmp_msg_t err_code = KMP_ERR(error);
219           __kmp_msg(kmp_ms_warning, KMP_MSG(GetAffSysCallNotSupported, env_var),
220                     err_code, __kmp_msg_null);
221           if (__kmp_generate_warnings == kmp_warnings_off) {
222             __kmp_str_free(&err_code.str);
223           }
224         }
225         KMP_AFFINITY_DISABLE();
226         KMP_INTERNAL_FREE(buf);
227         return;
228       }
229       continue;
230     }
231 
232     sCode = syscall(__NR_sched_setaffinity, 0, gCode, NULL);
233     KA_TRACE(30, ("__kmp_affinity_determine_capable: "
234                   "setaffinity for mask size %d returned %d errno = %d\n",
235                   gCode, sCode, errno));
236     if (sCode < 0) {
237       if (errno == ENOSYS) { // Linux* OS only
238         // We shouldn't get here
239         KA_TRACE(30, ("__kmp_affinity_determine_capable: "
240                       "inconsistent OS call behavior: errno == ENOSYS for mask "
241                       "size %d\n",
242                       size));
243         if (__kmp_affinity_verbose ||
244             (__kmp_affinity_warnings &&
245              (__kmp_affinity_type != affinity_none) &&
246              (__kmp_affinity_type != affinity_default) &&
247              (__kmp_affinity_type != affinity_disabled))) {
248           int error = errno;
249           kmp_msg_t err_code = KMP_ERR(error);
250           __kmp_msg(kmp_ms_warning, KMP_MSG(SetAffSysCallNotSupported, env_var),
251                     err_code, __kmp_msg_null);
252           if (__kmp_generate_warnings == kmp_warnings_off) {
253             __kmp_str_free(&err_code.str);
254           }
255         }
256         KMP_AFFINITY_DISABLE();
257         KMP_INTERNAL_FREE(buf);
258         return;
259       }
260       if (errno == EFAULT) {
261         KMP_AFFINITY_ENABLE(gCode);
262         KA_TRACE(10, ("__kmp_affinity_determine_capable: "
263                       "affinity supported (mask size %d)\n",
264                       (int)__kmp_affin_mask_size));
265         KMP_INTERNAL_FREE(buf);
266         return;
267       }
268     }
269   }
270   // save uncaught error code
271   // int error = errno;
272   KMP_INTERNAL_FREE(buf);
273   // restore uncaught error code, will be printed at the next KMP_WARNING below
274   // errno = error;
275 
276   // Affinity is not supported
277   KMP_AFFINITY_DISABLE();
278   KA_TRACE(10, ("__kmp_affinity_determine_capable: "
279                 "cannot determine mask size - affinity not supported\n"));
280   if (__kmp_affinity_verbose ||
281       (__kmp_affinity_warnings && (__kmp_affinity_type != affinity_none) &&
282        (__kmp_affinity_type != affinity_default) &&
283        (__kmp_affinity_type != affinity_disabled))) {
284     KMP_WARNING(AffCantGetMaskSize, env_var);
285   }
286 }
287 
288 #endif // KMP_OS_LINUX && KMP_AFFINITY_SUPPORTED
289 
290 #if KMP_USE_FUTEX
291 
292 int __kmp_futex_determine_capable() {
293   int loc = 0;
294   int rc = syscall(__NR_futex, &loc, FUTEX_WAKE, 1, NULL, NULL, 0);
295   int retval = (rc == 0) || (errno != ENOSYS);
296 
297   KA_TRACE(10,
298            ("__kmp_futex_determine_capable: rc = %d errno = %d\n", rc, errno));
299   KA_TRACE(10, ("__kmp_futex_determine_capable: futex syscall%s supported\n",
300                 retval ? "" : " not"));
301 
302   return retval;
303 }
304 
305 #endif // KMP_USE_FUTEX
306 
307 #if (KMP_ARCH_X86 || KMP_ARCH_X86_64) && (!KMP_ASM_INTRINS)
308 /* Only 32-bit "add-exchange" instruction on IA-32 architecture causes us to
309    use compare_and_store for these routines */
310 
311 kmp_int8 __kmp_test_then_or8(volatile kmp_int8 *p, kmp_int8 d) {
312   kmp_int8 old_value, new_value;
313 
314   old_value = TCR_1(*p);
315   new_value = old_value | d;
316 
317   while (!KMP_COMPARE_AND_STORE_REL8(p, old_value, new_value)) {
318     KMP_CPU_PAUSE();
319     old_value = TCR_1(*p);
320     new_value = old_value | d;
321   }
322   return old_value;
323 }
324 
325 kmp_int8 __kmp_test_then_and8(volatile kmp_int8 *p, kmp_int8 d) {
326   kmp_int8 old_value, new_value;
327 
328   old_value = TCR_1(*p);
329   new_value = old_value & d;
330 
331   while (!KMP_COMPARE_AND_STORE_REL8(p, old_value, new_value)) {
332     KMP_CPU_PAUSE();
333     old_value = TCR_1(*p);
334     new_value = old_value & d;
335   }
336   return old_value;
337 }
338 
339 kmp_uint32 __kmp_test_then_or32(volatile kmp_uint32 *p, kmp_uint32 d) {
340   kmp_uint32 old_value, new_value;
341 
342   old_value = TCR_4(*p);
343   new_value = old_value | d;
344 
345   while (!KMP_COMPARE_AND_STORE_REL32(p, old_value, new_value)) {
346     KMP_CPU_PAUSE();
347     old_value = TCR_4(*p);
348     new_value = old_value | d;
349   }
350   return old_value;
351 }
352 
353 kmp_uint32 __kmp_test_then_and32(volatile kmp_uint32 *p, kmp_uint32 d) {
354   kmp_uint32 old_value, new_value;
355 
356   old_value = TCR_4(*p);
357   new_value = old_value & d;
358 
359   while (!KMP_COMPARE_AND_STORE_REL32(p, old_value, new_value)) {
360     KMP_CPU_PAUSE();
361     old_value = TCR_4(*p);
362     new_value = old_value & d;
363   }
364   return old_value;
365 }
366 
367 #if KMP_ARCH_X86
368 kmp_int8 __kmp_test_then_add8(volatile kmp_int8 *p, kmp_int8 d) {
369   kmp_int8 old_value, new_value;
370 
371   old_value = TCR_1(*p);
372   new_value = old_value + d;
373 
374   while (!KMP_COMPARE_AND_STORE_REL8(p, old_value, new_value)) {
375     KMP_CPU_PAUSE();
376     old_value = TCR_1(*p);
377     new_value = old_value + d;
378   }
379   return old_value;
380 }
381 
382 kmp_int64 __kmp_test_then_add64(volatile kmp_int64 *p, kmp_int64 d) {
383   kmp_int64 old_value, new_value;
384 
385   old_value = TCR_8(*p);
386   new_value = old_value + d;
387 
388   while (!KMP_COMPARE_AND_STORE_REL64(p, old_value, new_value)) {
389     KMP_CPU_PAUSE();
390     old_value = TCR_8(*p);
391     new_value = old_value + d;
392   }
393   return old_value;
394 }
395 #endif /* KMP_ARCH_X86 */
396 
397 kmp_uint64 __kmp_test_then_or64(volatile kmp_uint64 *p, kmp_uint64 d) {
398   kmp_uint64 old_value, new_value;
399 
400   old_value = TCR_8(*p);
401   new_value = old_value | d;
402   while (!KMP_COMPARE_AND_STORE_REL64(p, old_value, new_value)) {
403     KMP_CPU_PAUSE();
404     old_value = TCR_8(*p);
405     new_value = old_value | d;
406   }
407   return old_value;
408 }
409 
410 kmp_uint64 __kmp_test_then_and64(volatile kmp_uint64 *p, kmp_uint64 d) {
411   kmp_uint64 old_value, new_value;
412 
413   old_value = TCR_8(*p);
414   new_value = old_value & d;
415   while (!KMP_COMPARE_AND_STORE_REL64(p, old_value, new_value)) {
416     KMP_CPU_PAUSE();
417     old_value = TCR_8(*p);
418     new_value = old_value & d;
419   }
420   return old_value;
421 }
422 
423 #endif /* (KMP_ARCH_X86 || KMP_ARCH_X86_64) && (! KMP_ASM_INTRINS) */
424 
425 void __kmp_terminate_thread(int gtid) {
426   int status;
427   kmp_info_t *th = __kmp_threads[gtid];
428 
429   if (!th)
430     return;
431 
432 #ifdef KMP_CANCEL_THREADS
433   KA_TRACE(10, ("__kmp_terminate_thread: kill (%d)\n", gtid));
434   status = pthread_cancel(th->th.th_info.ds.ds_thread);
435   if (status != 0 && status != ESRCH) {
436     __kmp_fatal(KMP_MSG(CantTerminateWorkerThread), KMP_ERR(status),
437                 __kmp_msg_null);
438   }
439 #endif
440   __kmp_yield(TRUE);
441 } //
442 
443 /* Set thread stack info according to values returned by pthread_getattr_np().
444    If values are unreasonable, assume call failed and use incremental stack
445    refinement method instead. Returns TRUE if the stack parameters could be
446    determined exactly, FALSE if incremental refinement is necessary. */
447 static kmp_int32 __kmp_set_stack_info(int gtid, kmp_info_t *th) {
448   int stack_data;
449 #if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD ||     \
450         KMP_OS_HURD
451   pthread_attr_t attr;
452   int status;
453   size_t size = 0;
454   void *addr = 0;
455 
456   /* Always do incremental stack refinement for ubermaster threads since the
457      initial thread stack range can be reduced by sibling thread creation so
458      pthread_attr_getstack may cause thread gtid aliasing */
459   if (!KMP_UBER_GTID(gtid)) {
460 
461     /* Fetch the real thread attributes */
462     status = pthread_attr_init(&attr);
463     KMP_CHECK_SYSFAIL("pthread_attr_init", status);
464 #if KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD
465     status = pthread_attr_get_np(pthread_self(), &attr);
466     KMP_CHECK_SYSFAIL("pthread_attr_get_np", status);
467 #else
468     status = pthread_getattr_np(pthread_self(), &attr);
469     KMP_CHECK_SYSFAIL("pthread_getattr_np", status);
470 #endif
471     status = pthread_attr_getstack(&attr, &addr, &size);
472     KMP_CHECK_SYSFAIL("pthread_attr_getstack", status);
473     KA_TRACE(60,
474              ("__kmp_set_stack_info: T#%d pthread_attr_getstack returned size:"
475               " %lu, low addr: %p\n",
476               gtid, size, addr));
477     status = pthread_attr_destroy(&attr);
478     KMP_CHECK_SYSFAIL("pthread_attr_destroy", status);
479   }
480 
481   if (size != 0 && addr != 0) { // was stack parameter determination successful?
482     /* Store the correct base and size */
483     TCW_PTR(th->th.th_info.ds.ds_stackbase, (((char *)addr) + size));
484     TCW_PTR(th->th.th_info.ds.ds_stacksize, size);
485     TCW_4(th->th.th_info.ds.ds_stackgrow, FALSE);
486     return TRUE;
487   }
488 #endif /* KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD ||
489               KMP_OS_HURD */
490   /* Use incremental refinement starting from initial conservative estimate */
491   TCW_PTR(th->th.th_info.ds.ds_stacksize, 0);
492   TCW_PTR(th->th.th_info.ds.ds_stackbase, &stack_data);
493   TCW_4(th->th.th_info.ds.ds_stackgrow, TRUE);
494   return FALSE;
495 }
496 
497 static void *__kmp_launch_worker(void *thr) {
498   int status, old_type, old_state;
499 #ifdef KMP_BLOCK_SIGNALS
500   sigset_t new_set, old_set;
501 #endif /* KMP_BLOCK_SIGNALS */
502   void *exit_val;
503 #if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD ||     \
504         KMP_OS_OPENBSD || KMP_OS_HURD
505   void *volatile padding = 0;
506 #endif
507   int gtid;
508 
509   gtid = ((kmp_info_t *)thr)->th.th_info.ds.ds_gtid;
510   __kmp_gtid_set_specific(gtid);
511 #ifdef KMP_TDATA_GTID
512   __kmp_gtid = gtid;
513 #endif
514 #if KMP_STATS_ENABLED
515   // set thread local index to point to thread-specific stats
516   __kmp_stats_thread_ptr = ((kmp_info_t *)thr)->th.th_stats;
517   __kmp_stats_thread_ptr->startLife();
518   KMP_SET_THREAD_STATE(IDLE);
519   KMP_INIT_PARTITIONED_TIMERS(OMP_idle);
520 #endif
521 
522 #if USE_ITT_BUILD
523   __kmp_itt_thread_name(gtid);
524 #endif /* USE_ITT_BUILD */
525 
526 #if KMP_AFFINITY_SUPPORTED
527   __kmp_affinity_set_init_mask(gtid, FALSE);
528 #endif
529 
530 #ifdef KMP_CANCEL_THREADS
531   status = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &old_type);
532   KMP_CHECK_SYSFAIL("pthread_setcanceltype", status);
533   // josh todo: isn't PTHREAD_CANCEL_ENABLE default for newly-created threads?
534   status = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_state);
535   KMP_CHECK_SYSFAIL("pthread_setcancelstate", status);
536 #endif
537 
538 #if KMP_ARCH_X86 || KMP_ARCH_X86_64
539   // Set FP control regs to be a copy of the parallel initialization thread's.
540   __kmp_clear_x87_fpu_status_word();
541   __kmp_load_x87_fpu_control_word(&__kmp_init_x87_fpu_control_word);
542   __kmp_load_mxcsr(&__kmp_init_mxcsr);
543 #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
544 
545 #ifdef KMP_BLOCK_SIGNALS
546   status = sigfillset(&new_set);
547   KMP_CHECK_SYSFAIL_ERRNO("sigfillset", status);
548   status = pthread_sigmask(SIG_BLOCK, &new_set, &old_set);
549   KMP_CHECK_SYSFAIL("pthread_sigmask", status);
550 #endif /* KMP_BLOCK_SIGNALS */
551 
552 #if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD ||     \
553         KMP_OS_OPENBSD
554   if (__kmp_stkoffset > 0 && gtid > 0) {
555     padding = KMP_ALLOCA(gtid * __kmp_stkoffset);
556   }
557 #endif
558 
559   KMP_MB();
560   __kmp_set_stack_info(gtid, (kmp_info_t *)thr);
561 
562   __kmp_check_stack_overlap((kmp_info_t *)thr);
563 
564   exit_val = __kmp_launch_thread((kmp_info_t *)thr);
565 
566 #ifdef KMP_BLOCK_SIGNALS
567   status = pthread_sigmask(SIG_SETMASK, &old_set, NULL);
568   KMP_CHECK_SYSFAIL("pthread_sigmask", status);
569 #endif /* KMP_BLOCK_SIGNALS */
570 
571   return exit_val;
572 }
573 
574 #if KMP_USE_MONITOR
575 /* The monitor thread controls all of the threads in the complex */
576 
577 static void *__kmp_launch_monitor(void *thr) {
578   int status, old_type, old_state;
579 #ifdef KMP_BLOCK_SIGNALS
580   sigset_t new_set;
581 #endif /* KMP_BLOCK_SIGNALS */
582   struct timespec interval;
583   int yield_count;
584   int yield_cycles = 0;
585 
586   KMP_MB(); /* Flush all pending memory write invalidates.  */
587 
588   KA_TRACE(10, ("__kmp_launch_monitor: #1 launched\n"));
589 
590   /* register us as the monitor thread */
591   __kmp_gtid_set_specific(KMP_GTID_MONITOR);
592 #ifdef KMP_TDATA_GTID
593   __kmp_gtid = KMP_GTID_MONITOR;
594 #endif
595 
596   KMP_MB();
597 
598 #if USE_ITT_BUILD
599   // Instruct Intel(R) Threading Tools to ignore monitor thread.
600   __kmp_itt_thread_ignore();
601 #endif /* USE_ITT_BUILD */
602 
603   __kmp_set_stack_info(((kmp_info_t *)thr)->th.th_info.ds.ds_gtid,
604                        (kmp_info_t *)thr);
605 
606   __kmp_check_stack_overlap((kmp_info_t *)thr);
607 
608 #ifdef KMP_CANCEL_THREADS
609   status = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &old_type);
610   KMP_CHECK_SYSFAIL("pthread_setcanceltype", status);
611   // josh todo: isn't PTHREAD_CANCEL_ENABLE default for newly-created threads?
612   status = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &old_state);
613   KMP_CHECK_SYSFAIL("pthread_setcancelstate", status);
614 #endif
615 
616 #if KMP_REAL_TIME_FIX
617   // This is a potential fix which allows application with real-time scheduling
618   // policy work. However, decision about the fix is not made yet, so it is
619   // disabled by default.
620   { // Are program started with real-time scheduling policy?
621     int sched = sched_getscheduler(0);
622     if (sched == SCHED_FIFO || sched == SCHED_RR) {
623       // Yes, we are a part of real-time application. Try to increase the
624       // priority of the monitor.
625       struct sched_param param;
626       int max_priority = sched_get_priority_max(sched);
627       int rc;
628       KMP_WARNING(RealTimeSchedNotSupported);
629       sched_getparam(0, &param);
630       if (param.sched_priority < max_priority) {
631         param.sched_priority += 1;
632         rc = sched_setscheduler(0, sched, &param);
633         if (rc != 0) {
634           int error = errno;
635           kmp_msg_t err_code = KMP_ERR(error);
636           __kmp_msg(kmp_ms_warning, KMP_MSG(CantChangeMonitorPriority),
637                     err_code, KMP_MSG(MonitorWillStarve), __kmp_msg_null);
638           if (__kmp_generate_warnings == kmp_warnings_off) {
639             __kmp_str_free(&err_code.str);
640           }
641         }
642       } else {
643         // We cannot abort here, because number of CPUs may be enough for all
644         // the threads, including the monitor thread, so application could
645         // potentially work...
646         __kmp_msg(kmp_ms_warning, KMP_MSG(RunningAtMaxPriority),
647                   KMP_MSG(MonitorWillStarve), KMP_HNT(RunningAtMaxPriority),
648                   __kmp_msg_null);
649       }
650     }
651     // AC: free thread that waits for monitor started
652     TCW_4(__kmp_global.g.g_time.dt.t_value, 0);
653   }
654 #endif // KMP_REAL_TIME_FIX
655 
656   KMP_MB(); /* Flush all pending memory write invalidates.  */
657 
658   if (__kmp_monitor_wakeups == 1) {
659     interval.tv_sec = 1;
660     interval.tv_nsec = 0;
661   } else {
662     interval.tv_sec = 0;
663     interval.tv_nsec = (KMP_NSEC_PER_SEC / __kmp_monitor_wakeups);
664   }
665 
666   KA_TRACE(10, ("__kmp_launch_monitor: #2 monitor\n"));
667 
668   if (__kmp_yield_cycle) {
669     __kmp_yielding_on = 0; /* Start out with yielding shut off */
670     yield_count = __kmp_yield_off_count;
671   } else {
672     __kmp_yielding_on = 1; /* Yielding is on permanently */
673   }
674 
675   while (!TCR_4(__kmp_global.g.g_done)) {
676     struct timespec now;
677     struct timeval tval;
678 
679     /*  This thread monitors the state of the system */
680 
681     KA_TRACE(15, ("__kmp_launch_monitor: update\n"));
682 
683     status = gettimeofday(&tval, NULL);
684     KMP_CHECK_SYSFAIL_ERRNO("gettimeofday", status);
685     TIMEVAL_TO_TIMESPEC(&tval, &now);
686 
687     now.tv_sec += interval.tv_sec;
688     now.tv_nsec += interval.tv_nsec;
689 
690     if (now.tv_nsec >= KMP_NSEC_PER_SEC) {
691       now.tv_sec += 1;
692       now.tv_nsec -= KMP_NSEC_PER_SEC;
693     }
694 
695     status = pthread_mutex_lock(&__kmp_wait_mx.m_mutex);
696     KMP_CHECK_SYSFAIL("pthread_mutex_lock", status);
697     // AC: the monitor should not fall asleep if g_done has been set
698     if (!TCR_4(__kmp_global.g.g_done)) { // check once more under mutex
699       status = pthread_cond_timedwait(&__kmp_wait_cv.c_cond,
700                                       &__kmp_wait_mx.m_mutex, &now);
701       if (status != 0) {
702         if (status != ETIMEDOUT && status != EINTR) {
703           KMP_SYSFAIL("pthread_cond_timedwait", status);
704         }
705       }
706     }
707     status = pthread_mutex_unlock(&__kmp_wait_mx.m_mutex);
708     KMP_CHECK_SYSFAIL("pthread_mutex_unlock", status);
709 
710     if (__kmp_yield_cycle) {
711       yield_cycles++;
712       if ((yield_cycles % yield_count) == 0) {
713         if (__kmp_yielding_on) {
714           __kmp_yielding_on = 0; /* Turn it off now */
715           yield_count = __kmp_yield_off_count;
716         } else {
717           __kmp_yielding_on = 1; /* Turn it on now */
718           yield_count = __kmp_yield_on_count;
719         }
720         yield_cycles = 0;
721       }
722     } else {
723       __kmp_yielding_on = 1;
724     }
725 
726     TCW_4(__kmp_global.g.g_time.dt.t_value,
727           TCR_4(__kmp_global.g.g_time.dt.t_value) + 1);
728 
729     KMP_MB(); /* Flush all pending memory write invalidates.  */
730   }
731 
732   KA_TRACE(10, ("__kmp_launch_monitor: #3 cleanup\n"));
733 
734 #ifdef KMP_BLOCK_SIGNALS
735   status = sigfillset(&new_set);
736   KMP_CHECK_SYSFAIL_ERRNO("sigfillset", status);
737   status = pthread_sigmask(SIG_UNBLOCK, &new_set, NULL);
738   KMP_CHECK_SYSFAIL("pthread_sigmask", status);
739 #endif /* KMP_BLOCK_SIGNALS */
740 
741   KA_TRACE(10, ("__kmp_launch_monitor: #4 finished\n"));
742 
743   if (__kmp_global.g.g_abort != 0) {
744     /* now we need to terminate the worker threads  */
745     /* the value of t_abort is the signal we caught */
746 
747     int gtid;
748 
749     KA_TRACE(10, ("__kmp_launch_monitor: #5 terminate sig=%d\n",
750                   __kmp_global.g.g_abort));
751 
752     /* terminate the OpenMP worker threads */
753     /* TODO this is not valid for sibling threads!!
754      * the uber master might not be 0 anymore.. */
755     for (gtid = 1; gtid < __kmp_threads_capacity; ++gtid)
756       __kmp_terminate_thread(gtid);
757 
758     __kmp_cleanup();
759 
760     KA_TRACE(10, ("__kmp_launch_monitor: #6 raise sig=%d\n",
761                   __kmp_global.g.g_abort));
762 
763     if (__kmp_global.g.g_abort > 0)
764       raise(__kmp_global.g.g_abort);
765   }
766 
767   KA_TRACE(10, ("__kmp_launch_monitor: #7 exit\n"));
768 
769   return thr;
770 }
771 #endif // KMP_USE_MONITOR
772 
773 void __kmp_create_worker(int gtid, kmp_info_t *th, size_t stack_size) {
774   pthread_t handle;
775   pthread_attr_t thread_attr;
776   int status;
777 
778   th->th.th_info.ds.ds_gtid = gtid;
779 
780 #if KMP_STATS_ENABLED
781   // sets up worker thread stats
782   __kmp_acquire_tas_lock(&__kmp_stats_lock, gtid);
783 
784   // th->th.th_stats is used to transfer thread-specific stats-pointer to
785   // __kmp_launch_worker. So when thread is created (goes into
786   // __kmp_launch_worker) it will set its thread local pointer to
787   // th->th.th_stats
788   if (!KMP_UBER_GTID(gtid)) {
789     th->th.th_stats = __kmp_stats_list->push_back(gtid);
790   } else {
791     // For root threads, __kmp_stats_thread_ptr is set in __kmp_register_root(),
792     // so set the th->th.th_stats field to it.
793     th->th.th_stats = __kmp_stats_thread_ptr;
794   }
795   __kmp_release_tas_lock(&__kmp_stats_lock, gtid);
796 
797 #endif // KMP_STATS_ENABLED
798 
799   if (KMP_UBER_GTID(gtid)) {
800     KA_TRACE(10, ("__kmp_create_worker: uber thread (%d)\n", gtid));
801     th->th.th_info.ds.ds_thread = pthread_self();
802     __kmp_set_stack_info(gtid, th);
803     __kmp_check_stack_overlap(th);
804     return;
805   }
806 
807   KA_TRACE(10, ("__kmp_create_worker: try to create thread (%d)\n", gtid));
808 
809   KMP_MB(); /* Flush all pending memory write invalidates.  */
810 
811 #ifdef KMP_THREAD_ATTR
812   status = pthread_attr_init(&thread_attr);
813   if (status != 0) {
814     __kmp_fatal(KMP_MSG(CantInitThreadAttrs), KMP_ERR(status), __kmp_msg_null);
815   }
816   status = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
817   if (status != 0) {
818     __kmp_fatal(KMP_MSG(CantSetWorkerState), KMP_ERR(status), __kmp_msg_null);
819   }
820 
821   /* Set stack size for this thread now.
822      The multiple of 2 is there because on some machines, requesting an unusual
823      stacksize causes the thread to have an offset before the dummy alloca()
824      takes place to create the offset.  Since we want the user to have a
825      sufficient stacksize AND support a stack offset, we alloca() twice the
826      offset so that the upcoming alloca() does not eliminate any premade offset,
827      and also gives the user the stack space they requested for all threads */
828   stack_size += gtid * __kmp_stkoffset * 2;
829 
830   KA_TRACE(10, ("__kmp_create_worker: T#%d, default stacksize = %lu bytes, "
831                 "__kmp_stksize = %lu bytes, final stacksize = %lu bytes\n",
832                 gtid, KMP_DEFAULT_STKSIZE, __kmp_stksize, stack_size));
833 
834 #ifdef _POSIX_THREAD_ATTR_STACKSIZE
835   status = pthread_attr_setstacksize(&thread_attr, stack_size);
836 #ifdef KMP_BACKUP_STKSIZE
837   if (status != 0) {
838     if (!__kmp_env_stksize) {
839       stack_size = KMP_BACKUP_STKSIZE + gtid * __kmp_stkoffset;
840       __kmp_stksize = KMP_BACKUP_STKSIZE;
841       KA_TRACE(10, ("__kmp_create_worker: T#%d, default stacksize = %lu bytes, "
842                     "__kmp_stksize = %lu bytes, (backup) final stacksize = %lu "
843                     "bytes\n",
844                     gtid, KMP_DEFAULT_STKSIZE, __kmp_stksize, stack_size));
845       status = pthread_attr_setstacksize(&thread_attr, stack_size);
846     }
847   }
848 #endif /* KMP_BACKUP_STKSIZE */
849   if (status != 0) {
850     __kmp_fatal(KMP_MSG(CantSetWorkerStackSize, stack_size), KMP_ERR(status),
851                 KMP_HNT(ChangeWorkerStackSize), __kmp_msg_null);
852   }
853 #endif /* _POSIX_THREAD_ATTR_STACKSIZE */
854 
855 #endif /* KMP_THREAD_ATTR */
856 
857   status =
858       pthread_create(&handle, &thread_attr, __kmp_launch_worker, (void *)th);
859   if (status != 0 || !handle) { // ??? Why do we check handle??
860 #ifdef _POSIX_THREAD_ATTR_STACKSIZE
861     if (status == EINVAL) {
862       __kmp_fatal(KMP_MSG(CantSetWorkerStackSize, stack_size), KMP_ERR(status),
863                   KMP_HNT(IncreaseWorkerStackSize), __kmp_msg_null);
864     }
865     if (status == ENOMEM) {
866       __kmp_fatal(KMP_MSG(CantSetWorkerStackSize, stack_size), KMP_ERR(status),
867                   KMP_HNT(DecreaseWorkerStackSize), __kmp_msg_null);
868     }
869 #endif /* _POSIX_THREAD_ATTR_STACKSIZE */
870     if (status == EAGAIN) {
871       __kmp_fatal(KMP_MSG(NoResourcesForWorkerThread), KMP_ERR(status),
872                   KMP_HNT(Decrease_NUM_THREADS), __kmp_msg_null);
873     }
874     KMP_SYSFAIL("pthread_create", status);
875   }
876 
877   th->th.th_info.ds.ds_thread = handle;
878 
879 #ifdef KMP_THREAD_ATTR
880   status = pthread_attr_destroy(&thread_attr);
881   if (status) {
882     kmp_msg_t err_code = KMP_ERR(status);
883     __kmp_msg(kmp_ms_warning, KMP_MSG(CantDestroyThreadAttrs), err_code,
884               __kmp_msg_null);
885     if (__kmp_generate_warnings == kmp_warnings_off) {
886       __kmp_str_free(&err_code.str);
887     }
888   }
889 #endif /* KMP_THREAD_ATTR */
890 
891   KMP_MB(); /* Flush all pending memory write invalidates.  */
892 
893   KA_TRACE(10, ("__kmp_create_worker: done creating thread (%d)\n", gtid));
894 
895 } // __kmp_create_worker
896 
897 #if KMP_USE_MONITOR
898 void __kmp_create_monitor(kmp_info_t *th) {
899   pthread_t handle;
900   pthread_attr_t thread_attr;
901   size_t size;
902   int status;
903   int auto_adj_size = FALSE;
904 
905   if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME) {
906     // We don't need monitor thread in case of MAX_BLOCKTIME
907     KA_TRACE(10, ("__kmp_create_monitor: skipping monitor thread because of "
908                   "MAX blocktime\n"));
909     th->th.th_info.ds.ds_tid = 0; // this makes reap_monitor no-op
910     th->th.th_info.ds.ds_gtid = 0;
911     return;
912   }
913   KA_TRACE(10, ("__kmp_create_monitor: try to create monitor\n"));
914 
915   KMP_MB(); /* Flush all pending memory write invalidates.  */
916 
917   th->th.th_info.ds.ds_tid = KMP_GTID_MONITOR;
918   th->th.th_info.ds.ds_gtid = KMP_GTID_MONITOR;
919 #if KMP_REAL_TIME_FIX
920   TCW_4(__kmp_global.g.g_time.dt.t_value,
921         -1); // Will use it for synchronization a bit later.
922 #else
923   TCW_4(__kmp_global.g.g_time.dt.t_value, 0);
924 #endif // KMP_REAL_TIME_FIX
925 
926 #ifdef KMP_THREAD_ATTR
927   if (__kmp_monitor_stksize == 0) {
928     __kmp_monitor_stksize = KMP_DEFAULT_MONITOR_STKSIZE;
929     auto_adj_size = TRUE;
930   }
931   status = pthread_attr_init(&thread_attr);
932   if (status != 0) {
933     __kmp_fatal(KMP_MSG(CantInitThreadAttrs), KMP_ERR(status), __kmp_msg_null);
934   }
935   status = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
936   if (status != 0) {
937     __kmp_fatal(KMP_MSG(CantSetMonitorState), KMP_ERR(status), __kmp_msg_null);
938   }
939 
940 #ifdef _POSIX_THREAD_ATTR_STACKSIZE
941   status = pthread_attr_getstacksize(&thread_attr, &size);
942   KMP_CHECK_SYSFAIL("pthread_attr_getstacksize", status);
943 #else
944   size = __kmp_sys_min_stksize;
945 #endif /* _POSIX_THREAD_ATTR_STACKSIZE */
946 #endif /* KMP_THREAD_ATTR */
947 
948   if (__kmp_monitor_stksize == 0) {
949     __kmp_monitor_stksize = KMP_DEFAULT_MONITOR_STKSIZE;
950   }
951   if (__kmp_monitor_stksize < __kmp_sys_min_stksize) {
952     __kmp_monitor_stksize = __kmp_sys_min_stksize;
953   }
954 
955   KA_TRACE(10, ("__kmp_create_monitor: default stacksize = %lu bytes,"
956                 "requested stacksize = %lu bytes\n",
957                 size, __kmp_monitor_stksize));
958 
959 retry:
960 
961 /* Set stack size for this thread now. */
962 #ifdef _POSIX_THREAD_ATTR_STACKSIZE
963   KA_TRACE(10, ("__kmp_create_monitor: setting stacksize = %lu bytes,",
964                 __kmp_monitor_stksize));
965   status = pthread_attr_setstacksize(&thread_attr, __kmp_monitor_stksize);
966   if (status != 0) {
967     if (auto_adj_size) {
968       __kmp_monitor_stksize *= 2;
969       goto retry;
970     }
971     kmp_msg_t err_code = KMP_ERR(status);
972     __kmp_msg(kmp_ms_warning, // should this be fatal?  BB
973               KMP_MSG(CantSetMonitorStackSize, (long int)__kmp_monitor_stksize),
974               err_code, KMP_HNT(ChangeMonitorStackSize), __kmp_msg_null);
975     if (__kmp_generate_warnings == kmp_warnings_off) {
976       __kmp_str_free(&err_code.str);
977     }
978   }
979 #endif /* _POSIX_THREAD_ATTR_STACKSIZE */
980 
981   status =
982       pthread_create(&handle, &thread_attr, __kmp_launch_monitor, (void *)th);
983 
984   if (status != 0) {
985 #ifdef _POSIX_THREAD_ATTR_STACKSIZE
986     if (status == EINVAL) {
987       if (auto_adj_size && (__kmp_monitor_stksize < (size_t)0x40000000)) {
988         __kmp_monitor_stksize *= 2;
989         goto retry;
990       }
991       __kmp_fatal(KMP_MSG(CantSetMonitorStackSize, __kmp_monitor_stksize),
992                   KMP_ERR(status), KMP_HNT(IncreaseMonitorStackSize),
993                   __kmp_msg_null);
994     }
995     if (status == ENOMEM) {
996       __kmp_fatal(KMP_MSG(CantSetMonitorStackSize, __kmp_monitor_stksize),
997                   KMP_ERR(status), KMP_HNT(DecreaseMonitorStackSize),
998                   __kmp_msg_null);
999     }
1000 #endif /* _POSIX_THREAD_ATTR_STACKSIZE */
1001     if (status == EAGAIN) {
1002       __kmp_fatal(KMP_MSG(NoResourcesForMonitorThread), KMP_ERR(status),
1003                   KMP_HNT(DecreaseNumberOfThreadsInUse), __kmp_msg_null);
1004     }
1005     KMP_SYSFAIL("pthread_create", status);
1006   }
1007 
1008   th->th.th_info.ds.ds_thread = handle;
1009 
1010 #if KMP_REAL_TIME_FIX
1011   // Wait for the monitor thread is really started and set its *priority*.
1012   KMP_DEBUG_ASSERT(sizeof(kmp_uint32) ==
1013                    sizeof(__kmp_global.g.g_time.dt.t_value));
1014   __kmp_wait_yield_4((kmp_uint32 volatile *)&__kmp_global.g.g_time.dt.t_value,
1015                      -1, &__kmp_neq_4, NULL);
1016 #endif // KMP_REAL_TIME_FIX
1017 
1018 #ifdef KMP_THREAD_ATTR
1019   status = pthread_attr_destroy(&thread_attr);
1020   if (status != 0) {
1021     kmp_msg_t err_code = KMP_ERR(status);
1022     __kmp_msg(kmp_ms_warning, KMP_MSG(CantDestroyThreadAttrs), err_code,
1023               __kmp_msg_null);
1024     if (__kmp_generate_warnings == kmp_warnings_off) {
1025       __kmp_str_free(&err_code.str);
1026     }
1027   }
1028 #endif
1029 
1030   KMP_MB(); /* Flush all pending memory write invalidates.  */
1031 
1032   KA_TRACE(10, ("__kmp_create_monitor: monitor created %#.8lx\n",
1033                 th->th.th_info.ds.ds_thread));
1034 
1035 } // __kmp_create_monitor
1036 #endif // KMP_USE_MONITOR
1037 
1038 void __kmp_exit_thread(int exit_status) {
1039   pthread_exit((void *)(intptr_t)exit_status);
1040 } // __kmp_exit_thread
1041 
1042 #if KMP_USE_MONITOR
1043 void __kmp_resume_monitor();
1044 
1045 void __kmp_reap_monitor(kmp_info_t *th) {
1046   int status;
1047   void *exit_val;
1048 
1049   KA_TRACE(10, ("__kmp_reap_monitor: try to reap monitor thread with handle"
1050                 " %#.8lx\n",
1051                 th->th.th_info.ds.ds_thread));
1052 
1053   // If monitor has been created, its tid and gtid should be KMP_GTID_MONITOR.
1054   // If both tid and gtid are 0, it means the monitor did not ever start.
1055   // If both tid and gtid are KMP_GTID_DNE, the monitor has been shut down.
1056   KMP_DEBUG_ASSERT(th->th.th_info.ds.ds_tid == th->th.th_info.ds.ds_gtid);
1057   if (th->th.th_info.ds.ds_gtid != KMP_GTID_MONITOR) {
1058     KA_TRACE(10, ("__kmp_reap_monitor: monitor did not start, returning\n"));
1059     return;
1060   }
1061 
1062   KMP_MB(); /* Flush all pending memory write invalidates.  */
1063 
1064   /* First, check to see whether the monitor thread exists to wake it up. This
1065      is to avoid performance problem when the monitor sleeps during
1066      blocktime-size interval */
1067 
1068   status = pthread_kill(th->th.th_info.ds.ds_thread, 0);
1069   if (status != ESRCH) {
1070     __kmp_resume_monitor(); // Wake up the monitor thread
1071   }
1072   KA_TRACE(10, ("__kmp_reap_monitor: try to join with monitor\n"));
1073   status = pthread_join(th->th.th_info.ds.ds_thread, &exit_val);
1074   if (exit_val != th) {
1075     __kmp_fatal(KMP_MSG(ReapMonitorError), KMP_ERR(status), __kmp_msg_null);
1076   }
1077 
1078   th->th.th_info.ds.ds_tid = KMP_GTID_DNE;
1079   th->th.th_info.ds.ds_gtid = KMP_GTID_DNE;
1080 
1081   KA_TRACE(10, ("__kmp_reap_monitor: done reaping monitor thread with handle"
1082                 " %#.8lx\n",
1083                 th->th.th_info.ds.ds_thread));
1084 
1085   KMP_MB(); /* Flush all pending memory write invalidates.  */
1086 }
1087 #endif // KMP_USE_MONITOR
1088 
1089 void __kmp_reap_worker(kmp_info_t *th) {
1090   int status;
1091   void *exit_val;
1092 
1093   KMP_MB(); /* Flush all pending memory write invalidates.  */
1094 
1095   KA_TRACE(
1096       10, ("__kmp_reap_worker: try to reap T#%d\n", th->th.th_info.ds.ds_gtid));
1097 
1098   status = pthread_join(th->th.th_info.ds.ds_thread, &exit_val);
1099 #ifdef KMP_DEBUG
1100   /* Don't expose these to the user until we understand when they trigger */
1101   if (status != 0) {
1102     __kmp_fatal(KMP_MSG(ReapWorkerError), KMP_ERR(status), __kmp_msg_null);
1103   }
1104   if (exit_val != th) {
1105     KA_TRACE(10, ("__kmp_reap_worker: worker T#%d did not reap properly, "
1106                   "exit_val = %p\n",
1107                   th->th.th_info.ds.ds_gtid, exit_val));
1108   }
1109 #endif /* KMP_DEBUG */
1110 
1111   KA_TRACE(10, ("__kmp_reap_worker: done reaping T#%d\n",
1112                 th->th.th_info.ds.ds_gtid));
1113 
1114   KMP_MB(); /* Flush all pending memory write invalidates.  */
1115 }
1116 
1117 #if KMP_HANDLE_SIGNALS
1118 
1119 static void __kmp_null_handler(int signo) {
1120   //  Do nothing, for doing SIG_IGN-type actions.
1121 } // __kmp_null_handler
1122 
1123 static void __kmp_team_handler(int signo) {
1124   if (__kmp_global.g.g_abort == 0) {
1125 /* Stage 1 signal handler, let's shut down all of the threads */
1126 #ifdef KMP_DEBUG
1127     __kmp_debug_printf("__kmp_team_handler: caught signal = %d\n", signo);
1128 #endif
1129     switch (signo) {
1130     case SIGHUP:
1131     case SIGINT:
1132     case SIGQUIT:
1133     case SIGILL:
1134     case SIGABRT:
1135     case SIGFPE:
1136     case SIGBUS:
1137     case SIGSEGV:
1138 #ifdef SIGSYS
1139     case SIGSYS:
1140 #endif
1141     case SIGTERM:
1142       if (__kmp_debug_buf) {
1143         __kmp_dump_debug_buffer();
1144       }
1145       KMP_MB(); // Flush all pending memory write invalidates.
1146       TCW_4(__kmp_global.g.g_abort, signo);
1147       KMP_MB(); // Flush all pending memory write invalidates.
1148       TCW_4(__kmp_global.g.g_done, TRUE);
1149       KMP_MB(); // Flush all pending memory write invalidates.
1150       break;
1151     default:
1152 #ifdef KMP_DEBUG
1153       __kmp_debug_printf("__kmp_team_handler: unknown signal type");
1154 #endif
1155       break;
1156     }
1157   }
1158 } // __kmp_team_handler
1159 
1160 static void __kmp_sigaction(int signum, const struct sigaction *act,
1161                             struct sigaction *oldact) {
1162   int rc = sigaction(signum, act, oldact);
1163   KMP_CHECK_SYSFAIL_ERRNO("sigaction", rc);
1164 }
1165 
1166 static void __kmp_install_one_handler(int sig, sig_func_t handler_func,
1167                                       int parallel_init) {
1168   KMP_MB(); // Flush all pending memory write invalidates.
1169   KB_TRACE(60,
1170            ("__kmp_install_one_handler( %d, ..., %d )\n", sig, parallel_init));
1171   if (parallel_init) {
1172     struct sigaction new_action;
1173     struct sigaction old_action;
1174     new_action.sa_handler = handler_func;
1175     new_action.sa_flags = 0;
1176     sigfillset(&new_action.sa_mask);
1177     __kmp_sigaction(sig, &new_action, &old_action);
1178     if (old_action.sa_handler == __kmp_sighldrs[sig].sa_handler) {
1179       sigaddset(&__kmp_sigset, sig);
1180     } else {
1181       // Restore/keep user's handler if one previously installed.
1182       __kmp_sigaction(sig, &old_action, NULL);
1183     }
1184   } else {
1185     // Save initial/system signal handlers to see if user handlers installed.
1186     __kmp_sigaction(sig, NULL, &__kmp_sighldrs[sig]);
1187   }
1188   KMP_MB(); // Flush all pending memory write invalidates.
1189 } // __kmp_install_one_handler
1190 
1191 static void __kmp_remove_one_handler(int sig) {
1192   KB_TRACE(60, ("__kmp_remove_one_handler( %d )\n", sig));
1193   if (sigismember(&__kmp_sigset, sig)) {
1194     struct sigaction old;
1195     KMP_MB(); // Flush all pending memory write invalidates.
1196     __kmp_sigaction(sig, &__kmp_sighldrs[sig], &old);
1197     if ((old.sa_handler != __kmp_team_handler) &&
1198         (old.sa_handler != __kmp_null_handler)) {
1199       // Restore the users signal handler.
1200       KB_TRACE(10, ("__kmp_remove_one_handler: oops, not our handler, "
1201                     "restoring: sig=%d\n",
1202                     sig));
1203       __kmp_sigaction(sig, &old, NULL);
1204     }
1205     sigdelset(&__kmp_sigset, sig);
1206     KMP_MB(); // Flush all pending memory write invalidates.
1207   }
1208 } // __kmp_remove_one_handler
1209 
1210 void __kmp_install_signals(int parallel_init) {
1211   KB_TRACE(10, ("__kmp_install_signals( %d )\n", parallel_init));
1212   if (__kmp_handle_signals || !parallel_init) {
1213     // If ! parallel_init, we do not install handlers, just save original
1214     // handlers. Let us do it even __handle_signals is 0.
1215     sigemptyset(&__kmp_sigset);
1216     __kmp_install_one_handler(SIGHUP, __kmp_team_handler, parallel_init);
1217     __kmp_install_one_handler(SIGINT, __kmp_team_handler, parallel_init);
1218     __kmp_install_one_handler(SIGQUIT, __kmp_team_handler, parallel_init);
1219     __kmp_install_one_handler(SIGILL, __kmp_team_handler, parallel_init);
1220     __kmp_install_one_handler(SIGABRT, __kmp_team_handler, parallel_init);
1221     __kmp_install_one_handler(SIGFPE, __kmp_team_handler, parallel_init);
1222     __kmp_install_one_handler(SIGBUS, __kmp_team_handler, parallel_init);
1223     __kmp_install_one_handler(SIGSEGV, __kmp_team_handler, parallel_init);
1224 #ifdef SIGSYS
1225     __kmp_install_one_handler(SIGSYS, __kmp_team_handler, parallel_init);
1226 #endif // SIGSYS
1227     __kmp_install_one_handler(SIGTERM, __kmp_team_handler, parallel_init);
1228 #ifdef SIGPIPE
1229     __kmp_install_one_handler(SIGPIPE, __kmp_team_handler, parallel_init);
1230 #endif // SIGPIPE
1231   }
1232 } // __kmp_install_signals
1233 
1234 void __kmp_remove_signals(void) {
1235   int sig;
1236   KB_TRACE(10, ("__kmp_remove_signals()\n"));
1237   for (sig = 1; sig < NSIG; ++sig) {
1238     __kmp_remove_one_handler(sig);
1239   }
1240 } // __kmp_remove_signals
1241 
1242 #endif // KMP_HANDLE_SIGNALS
1243 
1244 void __kmp_enable(int new_state) {
1245 #ifdef KMP_CANCEL_THREADS
1246   int status, old_state;
1247   status = pthread_setcancelstate(new_state, &old_state);
1248   KMP_CHECK_SYSFAIL("pthread_setcancelstate", status);
1249   KMP_DEBUG_ASSERT(old_state == PTHREAD_CANCEL_DISABLE);
1250 #endif
1251 }
1252 
1253 void __kmp_disable(int *old_state) {
1254 #ifdef KMP_CANCEL_THREADS
1255   int status;
1256   status = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, old_state);
1257   KMP_CHECK_SYSFAIL("pthread_setcancelstate", status);
1258 #endif
1259 }
1260 
1261 static void __kmp_atfork_prepare(void) {
1262   __kmp_acquire_bootstrap_lock(&__kmp_initz_lock);
1263   __kmp_acquire_bootstrap_lock(&__kmp_forkjoin_lock);
1264 }
1265 
1266 static void __kmp_atfork_parent(void) {
1267   __kmp_release_bootstrap_lock(&__kmp_initz_lock);
1268   __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
1269 }
1270 
1271 /* Reset the library so execution in the child starts "all over again" with
1272    clean data structures in initial states.  Don't worry about freeing memory
1273    allocated by parent, just abandon it to be safe. */
1274 static void __kmp_atfork_child(void) {
1275   __kmp_release_bootstrap_lock(&__kmp_forkjoin_lock);
1276   /* TODO make sure this is done right for nested/sibling */
1277   // ATT:  Memory leaks are here? TODO: Check it and fix.
1278   /* KMP_ASSERT( 0 ); */
1279 
1280   ++__kmp_fork_count;
1281 
1282 #if KMP_AFFINITY_SUPPORTED
1283 #if KMP_OS_LINUX
1284   // reset the affinity in the child to the initial thread
1285   // affinity in the parent
1286   kmp_set_thread_affinity_mask_initial();
1287 #endif
1288   // Set default not to bind threads tightly in the child (we’re expecting
1289   // over-subscription after the fork and this can improve things for
1290   // scripting languages that use OpenMP inside process-parallel code).
1291   __kmp_affinity_type = affinity_none;
1292 #if OMP_40_ENABLED
1293   if (__kmp_nested_proc_bind.bind_types != NULL) {
1294     __kmp_nested_proc_bind.bind_types[0] = proc_bind_false;
1295   }
1296 #endif // OMP_40_ENABLED
1297 #endif // KMP_AFFINITY_SUPPORTED
1298 
1299   __kmp_init_runtime = FALSE;
1300 #if KMP_USE_MONITOR
1301   __kmp_init_monitor = 0;
1302 #endif
1303   __kmp_init_parallel = FALSE;
1304   __kmp_init_middle = FALSE;
1305   __kmp_init_serial = FALSE;
1306   TCW_4(__kmp_init_gtid, FALSE);
1307   __kmp_init_common = FALSE;
1308 
1309   TCW_4(__kmp_init_user_locks, FALSE);
1310 #if !KMP_USE_DYNAMIC_LOCK
1311   __kmp_user_lock_table.used = 1;
1312   __kmp_user_lock_table.allocated = 0;
1313   __kmp_user_lock_table.table = NULL;
1314   __kmp_lock_blocks = NULL;
1315 #endif
1316 
1317   __kmp_all_nth = 0;
1318   TCW_4(__kmp_nth, 0);
1319 
1320   __kmp_thread_pool = NULL;
1321   __kmp_thread_pool_insert_pt = NULL;
1322   __kmp_team_pool = NULL;
1323 
1324   /* Must actually zero all the *cache arguments passed to __kmpc_threadprivate
1325      here so threadprivate doesn't use stale data */
1326   KA_TRACE(10, ("__kmp_atfork_child: checking cache address list %p\n",
1327                 __kmp_threadpriv_cache_list));
1328 
1329   while (__kmp_threadpriv_cache_list != NULL) {
1330 
1331     if (*__kmp_threadpriv_cache_list->addr != NULL) {
1332       KC_TRACE(50, ("__kmp_atfork_child: zeroing cache at address %p\n",
1333                     &(*__kmp_threadpriv_cache_list->addr)));
1334 
1335       *__kmp_threadpriv_cache_list->addr = NULL;
1336     }
1337     __kmp_threadpriv_cache_list = __kmp_threadpriv_cache_list->next;
1338   }
1339 
1340   __kmp_init_runtime = FALSE;
1341 
1342   /* reset statically initialized locks */
1343   __kmp_init_bootstrap_lock(&__kmp_initz_lock);
1344   __kmp_init_bootstrap_lock(&__kmp_stdio_lock);
1345   __kmp_init_bootstrap_lock(&__kmp_console_lock);
1346   __kmp_init_bootstrap_lock(&__kmp_task_team_lock);
1347 
1348 #if USE_ITT_BUILD
1349   __kmp_itt_reset(); // reset ITT's global state
1350 #endif /* USE_ITT_BUILD */
1351 
1352   /* This is necessary to make sure no stale data is left around */
1353   /* AC: customers complain that we use unsafe routines in the atfork
1354      handler. Mathworks: dlsym() is unsafe. We call dlsym and dlopen
1355      in dynamic_link when check the presence of shared tbbmalloc library.
1356      Suggestion is to make the library initialization lazier, similar
1357      to what done for __kmpc_begin(). */
1358   // TODO: synchronize all static initializations with regular library
1359   //       startup; look at kmp_global.cpp and etc.
1360   //__kmp_internal_begin ();
1361 }
1362 
1363 void __kmp_register_atfork(void) {
1364   if (__kmp_need_register_atfork) {
1365     int status = pthread_atfork(__kmp_atfork_prepare, __kmp_atfork_parent,
1366                                 __kmp_atfork_child);
1367     KMP_CHECK_SYSFAIL("pthread_atfork", status);
1368     __kmp_need_register_atfork = FALSE;
1369   }
1370 }
1371 
1372 void __kmp_suspend_initialize(void) {
1373   int status;
1374   status = pthread_mutexattr_init(&__kmp_suspend_mutex_attr);
1375   KMP_CHECK_SYSFAIL("pthread_mutexattr_init", status);
1376   status = pthread_condattr_init(&__kmp_suspend_cond_attr);
1377   KMP_CHECK_SYSFAIL("pthread_condattr_init", status);
1378 }
1379 
1380 static void __kmp_suspend_initialize_thread(kmp_info_t *th) {
1381   ANNOTATE_HAPPENS_AFTER(&th->th.th_suspend_init_count);
1382   if (th->th.th_suspend_init_count <= __kmp_fork_count) {
1383     /* this means we haven't initialized the suspension pthread objects for this
1384        thread in this instance of the process */
1385     int status;
1386     status = pthread_cond_init(&th->th.th_suspend_cv.c_cond,
1387                                &__kmp_suspend_cond_attr);
1388     KMP_CHECK_SYSFAIL("pthread_cond_init", status);
1389     status = pthread_mutex_init(&th->th.th_suspend_mx.m_mutex,
1390                                 &__kmp_suspend_mutex_attr);
1391     KMP_CHECK_SYSFAIL("pthread_mutex_init", status);
1392     *(volatile int *)&th->th.th_suspend_init_count = __kmp_fork_count + 1;
1393     ANNOTATE_HAPPENS_BEFORE(&th->th.th_suspend_init_count);
1394   }
1395 }
1396 
1397 void __kmp_suspend_uninitialize_thread(kmp_info_t *th) {
1398   if (th->th.th_suspend_init_count > __kmp_fork_count) {
1399     /* this means we have initialize the suspension pthread objects for this
1400        thread in this instance of the process */
1401     int status;
1402 
1403     status = pthread_cond_destroy(&th->th.th_suspend_cv.c_cond);
1404     if (status != 0 && status != EBUSY) {
1405       KMP_SYSFAIL("pthread_cond_destroy", status);
1406     }
1407     status = pthread_mutex_destroy(&th->th.th_suspend_mx.m_mutex);
1408     if (status != 0 && status != EBUSY) {
1409       KMP_SYSFAIL("pthread_mutex_destroy", status);
1410     }
1411     --th->th.th_suspend_init_count;
1412     KMP_DEBUG_ASSERT(th->th.th_suspend_init_count == __kmp_fork_count);
1413   }
1414 }
1415 
1416 // return true if lock obtained, false otherwise
1417 int __kmp_try_suspend_mx(kmp_info_t *th) {
1418   return (pthread_mutex_trylock(&th->th.th_suspend_mx.m_mutex) == 0);
1419 }
1420 
1421 void __kmp_lock_suspend_mx(kmp_info_t *th) {
1422   int status = pthread_mutex_lock(&th->th.th_suspend_mx.m_mutex);
1423   KMP_CHECK_SYSFAIL("pthread_mutex_lock", status);
1424 }
1425 
1426 void __kmp_unlock_suspend_mx(kmp_info_t *th) {
1427   int status = pthread_mutex_unlock(&th->th.th_suspend_mx.m_mutex);
1428   KMP_CHECK_SYSFAIL("pthread_mutex_unlock", status);
1429 }
1430 
1431 /* This routine puts the calling thread to sleep after setting the
1432    sleep bit for the indicated flag variable to true. */
1433 template <class C>
1434 static inline void __kmp_suspend_template(int th_gtid, C *flag) {
1435   KMP_TIME_DEVELOPER_PARTITIONED_BLOCK(USER_suspend);
1436   kmp_info_t *th = __kmp_threads[th_gtid];
1437   int status;
1438   typename C::flag_t old_spin;
1439 
1440   KF_TRACE(30, ("__kmp_suspend_template: T#%d enter for flag = %p\n", th_gtid,
1441                 flag->get()));
1442 
1443   __kmp_suspend_initialize_thread(th);
1444 
1445   status = pthread_mutex_lock(&th->th.th_suspend_mx.m_mutex);
1446   KMP_CHECK_SYSFAIL("pthread_mutex_lock", status);
1447 
1448   KF_TRACE(10, ("__kmp_suspend_template: T#%d setting sleep bit for spin(%p)\n",
1449                 th_gtid, flag->get()));
1450 
1451   /* TODO: shouldn't this use release semantics to ensure that
1452      __kmp_suspend_initialize_thread gets called first? */
1453   old_spin = flag->set_sleeping();
1454 #if OMP_50_ENABLED
1455   if (__kmp_dflt_blocktime == KMP_MAX_BLOCKTIME &&
1456       __kmp_pause_status != kmp_soft_paused) {
1457     flag->unset_sleeping();
1458     status = pthread_mutex_unlock(&th->th.th_suspend_mx.m_mutex);
1459     KMP_CHECK_SYSFAIL("pthread_mutex_unlock", status);
1460     return;
1461   }
1462 #endif
1463   KF_TRACE(5, ("__kmp_suspend_template: T#%d set sleep bit for spin(%p)==%x,"
1464                " was %x\n",
1465                th_gtid, flag->get(), flag->load(), old_spin));
1466 
1467   if (flag->done_check_val(old_spin)) {
1468     old_spin = flag->unset_sleeping();
1469     KF_TRACE(5, ("__kmp_suspend_template: T#%d false alarm, reset sleep bit "
1470                  "for spin(%p)\n",
1471                  th_gtid, flag->get()));
1472   } else {
1473     /* Encapsulate in a loop as the documentation states that this may
1474        "with low probability" return when the condition variable has
1475        not been signaled or broadcast */
1476     int deactivated = FALSE;
1477     TCW_PTR(th->th.th_sleep_loc, (void *)flag);
1478 
1479     while (flag->is_sleeping()) {
1480 #ifdef DEBUG_SUSPEND
1481       char buffer[128];
1482       __kmp_suspend_count++;
1483       __kmp_print_cond(buffer, &th->th.th_suspend_cv);
1484       __kmp_printf("__kmp_suspend_template: suspending T#%d: %s\n", th_gtid,
1485                    buffer);
1486 #endif
1487       // Mark the thread as no longer active (only in the first iteration of the
1488       // loop).
1489       if (!deactivated) {
1490         th->th.th_active = FALSE;
1491         if (th->th.th_active_in_pool) {
1492           th->th.th_active_in_pool = FALSE;
1493           KMP_ATOMIC_DEC(&__kmp_thread_pool_active_nth);
1494           KMP_DEBUG_ASSERT(TCR_4(__kmp_thread_pool_active_nth) >= 0);
1495         }
1496         deactivated = TRUE;
1497       }
1498 
1499 #if USE_SUSPEND_TIMEOUT
1500       struct timespec now;
1501       struct timeval tval;
1502       int msecs;
1503 
1504       status = gettimeofday(&tval, NULL);
1505       KMP_CHECK_SYSFAIL_ERRNO("gettimeofday", status);
1506       TIMEVAL_TO_TIMESPEC(&tval, &now);
1507 
1508       msecs = (4 * __kmp_dflt_blocktime) + 200;
1509       now.tv_sec += msecs / 1000;
1510       now.tv_nsec += (msecs % 1000) * 1000;
1511 
1512       KF_TRACE(15, ("__kmp_suspend_template: T#%d about to perform "
1513                     "pthread_cond_timedwait\n",
1514                     th_gtid));
1515       status = pthread_cond_timedwait(&th->th.th_suspend_cv.c_cond,
1516                                       &th->th.th_suspend_mx.m_mutex, &now);
1517 #else
1518       KF_TRACE(15, ("__kmp_suspend_template: T#%d about to perform"
1519                     " pthread_cond_wait\n",
1520                     th_gtid));
1521       status = pthread_cond_wait(&th->th.th_suspend_cv.c_cond,
1522                                  &th->th.th_suspend_mx.m_mutex);
1523 #endif
1524 
1525       if ((status != 0) && (status != EINTR) && (status != ETIMEDOUT)) {
1526         KMP_SYSFAIL("pthread_cond_wait", status);
1527       }
1528 #ifdef KMP_DEBUG
1529       if (status == ETIMEDOUT) {
1530         if (flag->is_sleeping()) {
1531           KF_TRACE(100,
1532                    ("__kmp_suspend_template: T#%d timeout wakeup\n", th_gtid));
1533         } else {
1534           KF_TRACE(2, ("__kmp_suspend_template: T#%d timeout wakeup, sleep bit "
1535                        "not set!\n",
1536                        th_gtid));
1537         }
1538       } else if (flag->is_sleeping()) {
1539         KF_TRACE(100,
1540                  ("__kmp_suspend_template: T#%d spurious wakeup\n", th_gtid));
1541       }
1542 #endif
1543     } // while
1544 
1545     // Mark the thread as active again (if it was previous marked as inactive)
1546     if (deactivated) {
1547       th->th.th_active = TRUE;
1548       if (TCR_4(th->th.th_in_pool)) {
1549         KMP_ATOMIC_INC(&__kmp_thread_pool_active_nth);
1550         th->th.th_active_in_pool = TRUE;
1551       }
1552     }
1553   }
1554 #ifdef DEBUG_SUSPEND
1555   {
1556     char buffer[128];
1557     __kmp_print_cond(buffer, &th->th.th_suspend_cv);
1558     __kmp_printf("__kmp_suspend_template: T#%d has awakened: %s\n", th_gtid,
1559                  buffer);
1560   }
1561 #endif
1562 
1563   status = pthread_mutex_unlock(&th->th.th_suspend_mx.m_mutex);
1564   KMP_CHECK_SYSFAIL("pthread_mutex_unlock", status);
1565   KF_TRACE(30, ("__kmp_suspend_template: T#%d exit\n", th_gtid));
1566 }
1567 
1568 void __kmp_suspend_32(int th_gtid, kmp_flag_32 *flag) {
1569   __kmp_suspend_template(th_gtid, flag);
1570 }
1571 void __kmp_suspend_64(int th_gtid, kmp_flag_64 *flag) {
1572   __kmp_suspend_template(th_gtid, flag);
1573 }
1574 void __kmp_suspend_oncore(int th_gtid, kmp_flag_oncore *flag) {
1575   __kmp_suspend_template(th_gtid, flag);
1576 }
1577 
1578 /* This routine signals the thread specified by target_gtid to wake up
1579    after setting the sleep bit indicated by the flag argument to FALSE.
1580    The target thread must already have called __kmp_suspend_template() */
1581 template <class C>
1582 static inline void __kmp_resume_template(int target_gtid, C *flag) {
1583   KMP_TIME_DEVELOPER_PARTITIONED_BLOCK(USER_resume);
1584   kmp_info_t *th = __kmp_threads[target_gtid];
1585   int status;
1586 
1587 #ifdef KMP_DEBUG
1588   int gtid = TCR_4(__kmp_init_gtid) ? __kmp_get_gtid() : -1;
1589 #endif
1590 
1591   KF_TRACE(30, ("__kmp_resume_template: T#%d wants to wakeup T#%d enter\n",
1592                 gtid, target_gtid));
1593   KMP_DEBUG_ASSERT(gtid != target_gtid);
1594 
1595   __kmp_suspend_initialize_thread(th);
1596 
1597   status = pthread_mutex_lock(&th->th.th_suspend_mx.m_mutex);
1598   KMP_CHECK_SYSFAIL("pthread_mutex_lock", status);
1599 
1600   if (!flag) { // coming from __kmp_null_resume_wrapper
1601     flag = (C *)CCAST(void *, th->th.th_sleep_loc);
1602   }
1603 
1604   // First, check if the flag is null or its type has changed. If so, someone
1605   // else woke it up.
1606   if (!flag || flag->get_type() != flag->get_ptr_type()) { // get_ptr_type
1607     // simply shows what
1608     // flag was cast to
1609     KF_TRACE(5, ("__kmp_resume_template: T#%d exiting, thread T#%d already "
1610                  "awake: flag(%p)\n",
1611                  gtid, target_gtid, NULL));
1612     status = pthread_mutex_unlock(&th->th.th_suspend_mx.m_mutex);
1613     KMP_CHECK_SYSFAIL("pthread_mutex_unlock", status);
1614     return;
1615   } else { // if multiple threads are sleeping, flag should be internally
1616     // referring to a specific thread here
1617     typename C::flag_t old_spin = flag->unset_sleeping();
1618     if (!flag->is_sleeping_val(old_spin)) {
1619       KF_TRACE(5, ("__kmp_resume_template: T#%d exiting, thread T#%d already "
1620                    "awake: flag(%p): "
1621                    "%u => %u\n",
1622                    gtid, target_gtid, flag->get(), old_spin, flag->load()));
1623       status = pthread_mutex_unlock(&th->th.th_suspend_mx.m_mutex);
1624       KMP_CHECK_SYSFAIL("pthread_mutex_unlock", status);
1625       return;
1626     }
1627     KF_TRACE(5, ("__kmp_resume_template: T#%d about to wakeup T#%d, reset "
1628                  "sleep bit for flag's loc(%p): "
1629                  "%u => %u\n",
1630                  gtid, target_gtid, flag->get(), old_spin, flag->load()));
1631   }
1632   TCW_PTR(th->th.th_sleep_loc, NULL);
1633 
1634 #ifdef DEBUG_SUSPEND
1635   {
1636     char buffer[128];
1637     __kmp_print_cond(buffer, &th->th.th_suspend_cv);
1638     __kmp_printf("__kmp_resume_template: T#%d resuming T#%d: %s\n", gtid,
1639                  target_gtid, buffer);
1640   }
1641 #endif
1642   status = pthread_cond_signal(&th->th.th_suspend_cv.c_cond);
1643   KMP_CHECK_SYSFAIL("pthread_cond_signal", status);
1644   status = pthread_mutex_unlock(&th->th.th_suspend_mx.m_mutex);
1645   KMP_CHECK_SYSFAIL("pthread_mutex_unlock", status);
1646   KF_TRACE(30, ("__kmp_resume_template: T#%d exiting after signaling wake up"
1647                 " for T#%d\n",
1648                 gtid, target_gtid));
1649 }
1650 
1651 void __kmp_resume_32(int target_gtid, kmp_flag_32 *flag) {
1652   __kmp_resume_template(target_gtid, flag);
1653 }
1654 void __kmp_resume_64(int target_gtid, kmp_flag_64 *flag) {
1655   __kmp_resume_template(target_gtid, flag);
1656 }
1657 void __kmp_resume_oncore(int target_gtid, kmp_flag_oncore *flag) {
1658   __kmp_resume_template(target_gtid, flag);
1659 }
1660 
1661 #if KMP_USE_MONITOR
1662 void __kmp_resume_monitor() {
1663   KMP_TIME_DEVELOPER_PARTITIONED_BLOCK(USER_resume);
1664   int status;
1665 #ifdef KMP_DEBUG
1666   int gtid = TCR_4(__kmp_init_gtid) ? __kmp_get_gtid() : -1;
1667   KF_TRACE(30, ("__kmp_resume_monitor: T#%d wants to wakeup T#%d enter\n", gtid,
1668                 KMP_GTID_MONITOR));
1669   KMP_DEBUG_ASSERT(gtid != KMP_GTID_MONITOR);
1670 #endif
1671   status = pthread_mutex_lock(&__kmp_wait_mx.m_mutex);
1672   KMP_CHECK_SYSFAIL("pthread_mutex_lock", status);
1673 #ifdef DEBUG_SUSPEND
1674   {
1675     char buffer[128];
1676     __kmp_print_cond(buffer, &__kmp_wait_cv.c_cond);
1677     __kmp_printf("__kmp_resume_monitor: T#%d resuming T#%d: %s\n", gtid,
1678                  KMP_GTID_MONITOR, buffer);
1679   }
1680 #endif
1681   status = pthread_cond_signal(&__kmp_wait_cv.c_cond);
1682   KMP_CHECK_SYSFAIL("pthread_cond_signal", status);
1683   status = pthread_mutex_unlock(&__kmp_wait_mx.m_mutex);
1684   KMP_CHECK_SYSFAIL("pthread_mutex_unlock", status);
1685   KF_TRACE(30, ("__kmp_resume_monitor: T#%d exiting after signaling wake up"
1686                 " for T#%d\n",
1687                 gtid, KMP_GTID_MONITOR));
1688 }
1689 #endif // KMP_USE_MONITOR
1690 
1691 void __kmp_yield(int cond) {
1692   if (!cond)
1693     return;
1694 #if KMP_USE_MONITOR
1695   if (!__kmp_yielding_on)
1696     return;
1697 #else
1698   if (__kmp_yield_cycle && !KMP_YIELD_NOW())
1699     return;
1700 #endif
1701   sched_yield();
1702 }
1703 
1704 void __kmp_gtid_set_specific(int gtid) {
1705   if (__kmp_init_gtid) {
1706     int status;
1707     status = pthread_setspecific(__kmp_gtid_threadprivate_key,
1708                                  (void *)(intptr_t)(gtid + 1));
1709     KMP_CHECK_SYSFAIL("pthread_setspecific", status);
1710   } else {
1711     KA_TRACE(50, ("__kmp_gtid_set_specific: runtime shutdown, returning\n"));
1712   }
1713 }
1714 
1715 int __kmp_gtid_get_specific() {
1716   int gtid;
1717   if (!__kmp_init_gtid) {
1718     KA_TRACE(50, ("__kmp_gtid_get_specific: runtime shutdown, returning "
1719                   "KMP_GTID_SHUTDOWN\n"));
1720     return KMP_GTID_SHUTDOWN;
1721   }
1722   gtid = (int)(size_t)pthread_getspecific(__kmp_gtid_threadprivate_key);
1723   if (gtid == 0) {
1724     gtid = KMP_GTID_DNE;
1725   } else {
1726     gtid--;
1727   }
1728   KA_TRACE(50, ("__kmp_gtid_get_specific: key:%d gtid:%d\n",
1729                 __kmp_gtid_threadprivate_key, gtid));
1730   return gtid;
1731 }
1732 
1733 double __kmp_read_cpu_time(void) {
1734   /*clock_t   t;*/
1735   struct tms buffer;
1736 
1737   /*t =*/times(&buffer);
1738 
1739   return (buffer.tms_utime + buffer.tms_cutime) / (double)CLOCKS_PER_SEC;
1740 }
1741 
1742 int __kmp_read_system_info(struct kmp_sys_info *info) {
1743   int status;
1744   struct rusage r_usage;
1745 
1746   memset(info, 0, sizeof(*info));
1747 
1748   status = getrusage(RUSAGE_SELF, &r_usage);
1749   KMP_CHECK_SYSFAIL_ERRNO("getrusage", status);
1750 
1751   // The maximum resident set size utilized (in kilobytes)
1752   info->maxrss = r_usage.ru_maxrss;
1753   // The number of page faults serviced without any I/O
1754   info->minflt = r_usage.ru_minflt;
1755   // The number of page faults serviced that required I/O
1756   info->majflt = r_usage.ru_majflt;
1757   // The number of times a process was "swapped" out of memory
1758   info->nswap = r_usage.ru_nswap;
1759   // The number of times the file system had to perform input
1760   info->inblock = r_usage.ru_inblock;
1761   // The number of times the file system had to perform output
1762   info->oublock = r_usage.ru_oublock;
1763   // The number of times a context switch was voluntarily
1764   info->nvcsw = r_usage.ru_nvcsw;
1765   // The number of times a context switch was forced
1766   info->nivcsw = r_usage.ru_nivcsw;
1767 
1768   return (status != 0);
1769 }
1770 
1771 void __kmp_read_system_time(double *delta) {
1772   double t_ns;
1773   struct timeval tval;
1774   struct timespec stop;
1775   int status;
1776 
1777   status = gettimeofday(&tval, NULL);
1778   KMP_CHECK_SYSFAIL_ERRNO("gettimeofday", status);
1779   TIMEVAL_TO_TIMESPEC(&tval, &stop);
1780   t_ns = TS2NS(stop) - TS2NS(__kmp_sys_timer_data.start);
1781   *delta = (t_ns * 1e-9);
1782 }
1783 
1784 void __kmp_clear_system_time(void) {
1785   struct timeval tval;
1786   int status;
1787   status = gettimeofday(&tval, NULL);
1788   KMP_CHECK_SYSFAIL_ERRNO("gettimeofday", status);
1789   TIMEVAL_TO_TIMESPEC(&tval, &__kmp_sys_timer_data.start);
1790 }
1791 
1792 static int __kmp_get_xproc(void) {
1793 
1794   int r = 0;
1795 
1796 #if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD ||     \
1797         KMP_OS_OPENBSD || KMP_OS_HURD
1798 
1799   r = sysconf(_SC_NPROCESSORS_ONLN);
1800 
1801 #elif KMP_OS_DARWIN
1802 
1803   // Bug C77011 High "OpenMP Threads and number of active cores".
1804 
1805   // Find the number of available CPUs.
1806   kern_return_t rc;
1807   host_basic_info_data_t info;
1808   mach_msg_type_number_t num = HOST_BASIC_INFO_COUNT;
1809   rc = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&info, &num);
1810   if (rc == 0 && num == HOST_BASIC_INFO_COUNT) {
1811     // Cannot use KA_TRACE() here because this code works before trace support
1812     // is initialized.
1813     r = info.avail_cpus;
1814   } else {
1815     KMP_WARNING(CantGetNumAvailCPU);
1816     KMP_INFORM(AssumedNumCPU);
1817   }
1818 
1819 #else
1820 
1821 #error "Unknown or unsupported OS."
1822 
1823 #endif
1824 
1825   return r > 0 ? r : 2; /* guess value of 2 if OS told us 0 */
1826 
1827 } // __kmp_get_xproc
1828 
1829 int __kmp_read_from_file(char const *path, char const *format, ...) {
1830   int result;
1831   va_list args;
1832 
1833   va_start(args, format);
1834   FILE *f = fopen(path, "rb");
1835   if (f == NULL)
1836     return 0;
1837   result = vfscanf(f, format, args);
1838   fclose(f);
1839 
1840   return result;
1841 }
1842 
1843 void __kmp_runtime_initialize(void) {
1844   int status;
1845   pthread_mutexattr_t mutex_attr;
1846   pthread_condattr_t cond_attr;
1847 
1848   if (__kmp_init_runtime) {
1849     return;
1850   }
1851 
1852 #if (KMP_ARCH_X86 || KMP_ARCH_X86_64)
1853   if (!__kmp_cpuinfo.initialized) {
1854     __kmp_query_cpuid(&__kmp_cpuinfo);
1855   }
1856 #endif /* KMP_ARCH_X86 || KMP_ARCH_X86_64 */
1857 
1858   __kmp_xproc = __kmp_get_xproc();
1859 
1860   if (sysconf(_SC_THREADS)) {
1861 
1862     /* Query the maximum number of threads */
1863     __kmp_sys_max_nth = sysconf(_SC_THREAD_THREADS_MAX);
1864     if (__kmp_sys_max_nth == -1) {
1865       /* Unlimited threads for NPTL */
1866       __kmp_sys_max_nth = INT_MAX;
1867     } else if (__kmp_sys_max_nth <= 1) {
1868       /* Can't tell, just use PTHREAD_THREADS_MAX */
1869       __kmp_sys_max_nth = KMP_MAX_NTH;
1870     }
1871 
1872     /* Query the minimum stack size */
1873     __kmp_sys_min_stksize = sysconf(_SC_THREAD_STACK_MIN);
1874     if (__kmp_sys_min_stksize <= 1) {
1875       __kmp_sys_min_stksize = KMP_MIN_STKSIZE;
1876     }
1877   }
1878 
1879   /* Set up minimum number of threads to switch to TLS gtid */
1880   __kmp_tls_gtid_min = KMP_TLS_GTID_MIN;
1881 
1882   status = pthread_key_create(&__kmp_gtid_threadprivate_key,
1883                               __kmp_internal_end_dest);
1884   KMP_CHECK_SYSFAIL("pthread_key_create", status);
1885   status = pthread_mutexattr_init(&mutex_attr);
1886   KMP_CHECK_SYSFAIL("pthread_mutexattr_init", status);
1887   status = pthread_mutex_init(&__kmp_wait_mx.m_mutex, &mutex_attr);
1888   KMP_CHECK_SYSFAIL("pthread_mutex_init", status);
1889   status = pthread_condattr_init(&cond_attr);
1890   KMP_CHECK_SYSFAIL("pthread_condattr_init", status);
1891   status = pthread_cond_init(&__kmp_wait_cv.c_cond, &cond_attr);
1892   KMP_CHECK_SYSFAIL("pthread_cond_init", status);
1893 #if USE_ITT_BUILD
1894   __kmp_itt_initialize();
1895 #endif /* USE_ITT_BUILD */
1896 
1897   __kmp_init_runtime = TRUE;
1898 }
1899 
1900 void __kmp_runtime_destroy(void) {
1901   int status;
1902 
1903   if (!__kmp_init_runtime) {
1904     return; // Nothing to do.
1905   }
1906 
1907 #if USE_ITT_BUILD
1908   __kmp_itt_destroy();
1909 #endif /* USE_ITT_BUILD */
1910 
1911   status = pthread_key_delete(__kmp_gtid_threadprivate_key);
1912   KMP_CHECK_SYSFAIL("pthread_key_delete", status);
1913 
1914   status = pthread_mutex_destroy(&__kmp_wait_mx.m_mutex);
1915   if (status != 0 && status != EBUSY) {
1916     KMP_SYSFAIL("pthread_mutex_destroy", status);
1917   }
1918   status = pthread_cond_destroy(&__kmp_wait_cv.c_cond);
1919   if (status != 0 && status != EBUSY) {
1920     KMP_SYSFAIL("pthread_cond_destroy", status);
1921   }
1922 #if KMP_AFFINITY_SUPPORTED
1923   __kmp_affinity_uninitialize();
1924 #endif
1925 
1926   __kmp_init_runtime = FALSE;
1927 }
1928 
1929 /* Put the thread to sleep for a time period */
1930 /* NOTE: not currently used anywhere */
1931 void __kmp_thread_sleep(int millis) { sleep((millis + 500) / 1000); }
1932 
1933 /* Calculate the elapsed wall clock time for the user */
1934 void __kmp_elapsed(double *t) {
1935   int status;
1936 #ifdef FIX_SGI_CLOCK
1937   struct timespec ts;
1938 
1939   status = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts);
1940   KMP_CHECK_SYSFAIL_ERRNO("clock_gettime", status);
1941   *t =
1942       (double)ts.tv_nsec * (1.0 / (double)KMP_NSEC_PER_SEC) + (double)ts.tv_sec;
1943 #else
1944   struct timeval tv;
1945 
1946   status = gettimeofday(&tv, NULL);
1947   KMP_CHECK_SYSFAIL_ERRNO("gettimeofday", status);
1948   *t =
1949       (double)tv.tv_usec * (1.0 / (double)KMP_USEC_PER_SEC) + (double)tv.tv_sec;
1950 #endif
1951 }
1952 
1953 /* Calculate the elapsed wall clock tick for the user */
1954 void __kmp_elapsed_tick(double *t) { *t = 1 / (double)CLOCKS_PER_SEC; }
1955 
1956 /* Return the current time stamp in nsec */
1957 kmp_uint64 __kmp_now_nsec() {
1958   struct timeval t;
1959   gettimeofday(&t, NULL);
1960   kmp_uint64 nsec = (kmp_uint64)KMP_NSEC_PER_SEC * (kmp_uint64)t.tv_sec +
1961                     (kmp_uint64)1000 * (kmp_uint64)t.tv_usec;
1962   return nsec;
1963 }
1964 
1965 #if KMP_ARCH_X86 || KMP_ARCH_X86_64
1966 /* Measure clock ticks per millisecond */
1967 void __kmp_initialize_system_tick() {
1968   kmp_uint64 now, nsec2, diff;
1969   kmp_uint64 delay = 100000; // 50~100 usec on most machines.
1970   kmp_uint64 nsec = __kmp_now_nsec();
1971   kmp_uint64 goal = __kmp_hardware_timestamp() + delay;
1972   while ((now = __kmp_hardware_timestamp()) < goal)
1973     ;
1974   nsec2 = __kmp_now_nsec();
1975   diff = nsec2 - nsec;
1976   if (diff > 0) {
1977     kmp_uint64 tpms = (kmp_uint64)(1e6 * (delay + (now - goal)) / diff);
1978     if (tpms > 0)
1979       __kmp_ticks_per_msec = tpms;
1980   }
1981 }
1982 #endif
1983 
1984 /* Determine whether the given address is mapped into the current address
1985    space. */
1986 
1987 int __kmp_is_address_mapped(void *addr) {
1988 
1989   int found = 0;
1990   int rc;
1991 
1992 #if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_HURD
1993 
1994   /* On GNUish OSes, read the /proc/<pid>/maps pseudo-file to get all the address
1995      ranges mapped into the address space. */
1996 
1997   char *name = __kmp_str_format("/proc/%d/maps", getpid());
1998   FILE *file = NULL;
1999 
2000   file = fopen(name, "r");
2001   KMP_ASSERT(file != NULL);
2002 
2003   for (;;) {
2004 
2005     void *beginning = NULL;
2006     void *ending = NULL;
2007     char perms[5];
2008 
2009     rc = fscanf(file, "%p-%p %4s %*[^\n]\n", &beginning, &ending, perms);
2010     if (rc == EOF) {
2011       break;
2012     }
2013     KMP_ASSERT(rc == 3 &&
2014                KMP_STRLEN(perms) == 4); // Make sure all fields are read.
2015 
2016     // Ending address is not included in the region, but beginning is.
2017     if ((addr >= beginning) && (addr < ending)) {
2018       perms[2] = 0; // 3th and 4th character does not matter.
2019       if (strcmp(perms, "rw") == 0) {
2020         // Memory we are looking for should be readable and writable.
2021         found = 1;
2022       }
2023       break;
2024     }
2025   }
2026 
2027   // Free resources.
2028   fclose(file);
2029   KMP_INTERNAL_FREE(name);
2030 
2031 #elif KMP_OS_DARWIN
2032 
2033   /* On OS X*, /proc pseudo filesystem is not available. Try to read memory
2034      using vm interface. */
2035 
2036   int buffer;
2037   vm_size_t count;
2038   rc = vm_read_overwrite(
2039       mach_task_self(), // Task to read memory of.
2040       (vm_address_t)(addr), // Address to read from.
2041       1, // Number of bytes to be read.
2042       (vm_address_t)(&buffer), // Address of buffer to save read bytes in.
2043       &count // Address of var to save number of read bytes in.
2044       );
2045   if (rc == 0) {
2046     // Memory successfully read.
2047     found = 1;
2048   }
2049 
2050 #elif KMP_OS_NETBSD
2051 
2052   int mib[5];
2053   mib[0] = CTL_VM;
2054   mib[1] = VM_PROC;
2055   mib[2] = VM_PROC_MAP;
2056   mib[3] = getpid();
2057   mib[4] = sizeof(struct kinfo_vmentry);
2058 
2059   size_t size;
2060   rc = sysctl(mib, __arraycount(mib), NULL, &size, NULL, 0);
2061   KMP_ASSERT(!rc);
2062   KMP_ASSERT(size);
2063 
2064   size = size * 4 / 3;
2065   struct kinfo_vmentry *kiv = (struct kinfo_vmentry *)KMP_INTERNAL_MALLOC(size);
2066   KMP_ASSERT(kiv);
2067 
2068   rc = sysctl(mib, __arraycount(mib), kiv, &size, NULL, 0);
2069   KMP_ASSERT(!rc);
2070   KMP_ASSERT(size);
2071 
2072   for (size_t i = 0; i < size; i++) {
2073     if (kiv[i].kve_start >= (uint64_t)addr &&
2074         kiv[i].kve_end <= (uint64_t)addr) {
2075       found = 1;
2076       break;
2077     }
2078   }
2079   KMP_INTERNAL_FREE(kiv);
2080 #elif KMP_OS_DRAGONFLY || KMP_OS_OPENBSD
2081 
2082   // FIXME(DragonFly, OpenBSD): Implement this
2083   found = 1;
2084 
2085 #else
2086 
2087 #error "Unknown or unsupported OS"
2088 
2089 #endif
2090 
2091   return found;
2092 
2093 } // __kmp_is_address_mapped
2094 
2095 #ifdef USE_LOAD_BALANCE
2096 
2097 #if KMP_OS_DARWIN || KMP_OS_NETBSD
2098 
2099 // The function returns the rounded value of the system load average
2100 // during given time interval which depends on the value of
2101 // __kmp_load_balance_interval variable (default is 60 sec, other values
2102 // may be 300 sec or 900 sec).
2103 // It returns -1 in case of error.
2104 int __kmp_get_load_balance(int max) {
2105   double averages[3];
2106   int ret_avg = 0;
2107 
2108   int res = getloadavg(averages, 3);
2109 
2110   // Check __kmp_load_balance_interval to determine which of averages to use.
2111   // getloadavg() may return the number of samples less than requested that is
2112   // less than 3.
2113   if (__kmp_load_balance_interval < 180 && (res >= 1)) {
2114     ret_avg = averages[0]; // 1 min
2115   } else if ((__kmp_load_balance_interval >= 180 &&
2116               __kmp_load_balance_interval < 600) &&
2117              (res >= 2)) {
2118     ret_avg = averages[1]; // 5 min
2119   } else if ((__kmp_load_balance_interval >= 600) && (res == 3)) {
2120     ret_avg = averages[2]; // 15 min
2121   } else { // Error occurred
2122     return -1;
2123   }
2124 
2125   return ret_avg;
2126 }
2127 
2128 #else // Linux* OS
2129 
2130 // The fuction returns number of running (not sleeping) threads, or -1 in case
2131 // of error. Error could be reported if Linux* OS kernel too old (without
2132 // "/proc" support). Counting running threads stops if max running threads
2133 // encountered.
2134 int __kmp_get_load_balance(int max) {
2135   static int permanent_error = 0;
2136   static int glb_running_threads = 0; // Saved count of the running threads for
2137   // the thread balance algortihm
2138   static double glb_call_time = 0; /* Thread balance algorithm call time */
2139 
2140   int running_threads = 0; // Number of running threads in the system.
2141 
2142   DIR *proc_dir = NULL; // Handle of "/proc/" directory.
2143   struct dirent *proc_entry = NULL;
2144 
2145   kmp_str_buf_t task_path; // "/proc/<pid>/task/<tid>/" path.
2146   DIR *task_dir = NULL; // Handle of "/proc/<pid>/task/<tid>/" directory.
2147   struct dirent *task_entry = NULL;
2148   int task_path_fixed_len;
2149 
2150   kmp_str_buf_t stat_path; // "/proc/<pid>/task/<tid>/stat" path.
2151   int stat_file = -1;
2152   int stat_path_fixed_len;
2153 
2154   int total_processes = 0; // Total number of processes in system.
2155   int total_threads = 0; // Total number of threads in system.
2156 
2157   double call_time = 0.0;
2158 
2159   __kmp_str_buf_init(&task_path);
2160   __kmp_str_buf_init(&stat_path);
2161 
2162   __kmp_elapsed(&call_time);
2163 
2164   if (glb_call_time &&
2165       (call_time - glb_call_time < __kmp_load_balance_interval)) {
2166     running_threads = glb_running_threads;
2167     goto finish;
2168   }
2169 
2170   glb_call_time = call_time;
2171 
2172   // Do not spend time on scanning "/proc/" if we have a permanent error.
2173   if (permanent_error) {
2174     running_threads = -1;
2175     goto finish;
2176   }
2177 
2178   if (max <= 0) {
2179     max = INT_MAX;
2180   }
2181 
2182   // Open "/proc/" directory.
2183   proc_dir = opendir("/proc");
2184   if (proc_dir == NULL) {
2185     // Cannot open "/prroc/". Probably the kernel does not support it. Return an
2186     // error now and in subsequent calls.
2187     running_threads = -1;
2188     permanent_error = 1;
2189     goto finish;
2190   }
2191 
2192   // Initialize fixed part of task_path. This part will not change.
2193   __kmp_str_buf_cat(&task_path, "/proc/", 6);
2194   task_path_fixed_len = task_path.used; // Remember number of used characters.
2195 
2196   proc_entry = readdir(proc_dir);
2197   while (proc_entry != NULL) {
2198     // Proc entry is a directory and name starts with a digit. Assume it is a
2199     // process' directory.
2200     if (proc_entry->d_type == DT_DIR && isdigit(proc_entry->d_name[0])) {
2201 
2202       ++total_processes;
2203       // Make sure init process is the very first in "/proc", so we can replace
2204       // strcmp( proc_entry->d_name, "1" ) == 0 with simpler total_processes ==
2205       // 1. We are going to check that total_processes == 1 => d_name == "1" is
2206       // true (where "=>" is implication). Since C++ does not have => operator,
2207       // let us replace it with its equivalent: a => b == ! a || b.
2208       KMP_DEBUG_ASSERT(total_processes != 1 ||
2209                        strcmp(proc_entry->d_name, "1") == 0);
2210 
2211       // Construct task_path.
2212       task_path.used = task_path_fixed_len; // Reset task_path to "/proc/".
2213       __kmp_str_buf_cat(&task_path, proc_entry->d_name,
2214                         KMP_STRLEN(proc_entry->d_name));
2215       __kmp_str_buf_cat(&task_path, "/task", 5);
2216 
2217       task_dir = opendir(task_path.str);
2218       if (task_dir == NULL) {
2219         // Process can finish between reading "/proc/" directory entry and
2220         // opening process' "task/" directory. So, in general case we should not
2221         // complain, but have to skip this process and read the next one. But on
2222         // systems with no "task/" support we will spend lot of time to scan
2223         // "/proc/" tree again and again without any benefit. "init" process
2224         // (its pid is 1) should exist always, so, if we cannot open
2225         // "/proc/1/task/" directory, it means "task/" is not supported by
2226         // kernel. Report an error now and in the future.
2227         if (strcmp(proc_entry->d_name, "1") == 0) {
2228           running_threads = -1;
2229           permanent_error = 1;
2230           goto finish;
2231         }
2232       } else {
2233         // Construct fixed part of stat file path.
2234         __kmp_str_buf_clear(&stat_path);
2235         __kmp_str_buf_cat(&stat_path, task_path.str, task_path.used);
2236         __kmp_str_buf_cat(&stat_path, "/", 1);
2237         stat_path_fixed_len = stat_path.used;
2238 
2239         task_entry = readdir(task_dir);
2240         while (task_entry != NULL) {
2241           // It is a directory and name starts with a digit.
2242           if (proc_entry->d_type == DT_DIR && isdigit(task_entry->d_name[0])) {
2243             ++total_threads;
2244 
2245             // Consruct complete stat file path. Easiest way would be:
2246             //  __kmp_str_buf_print( & stat_path, "%s/%s/stat", task_path.str,
2247             //  task_entry->d_name );
2248             // but seriae of __kmp_str_buf_cat works a bit faster.
2249             stat_path.used =
2250                 stat_path_fixed_len; // Reset stat path to its fixed part.
2251             __kmp_str_buf_cat(&stat_path, task_entry->d_name,
2252                               KMP_STRLEN(task_entry->d_name));
2253             __kmp_str_buf_cat(&stat_path, "/stat", 5);
2254 
2255             // Note: Low-level API (open/read/close) is used. High-level API
2256             // (fopen/fclose)  works ~ 30 % slower.
2257             stat_file = open(stat_path.str, O_RDONLY);
2258             if (stat_file == -1) {
2259               // We cannot report an error because task (thread) can terminate
2260               // just before reading this file.
2261             } else {
2262               /* Content of "stat" file looks like:
2263                  24285 (program) S ...
2264 
2265                  It is a single line (if program name does not include funny
2266                  symbols). First number is a thread id, then name of executable
2267                  file name in paretheses, then state of the thread. We need just
2268                  thread state.
2269 
2270                  Good news: Length of program name is 15 characters max. Longer
2271                  names are truncated.
2272 
2273                  Thus, we need rather short buffer: 15 chars for program name +
2274                  2 parenthesis, + 3 spaces + ~7 digits of pid = 37.
2275 
2276                  Bad news: Program name may contain special symbols like space,
2277                  closing parenthesis, or even new line. This makes parsing
2278                  "stat" file not 100 % reliable. In case of fanny program names
2279                  parsing may fail (report incorrect thread state).
2280 
2281                  Parsing "status" file looks more promissing (due to different
2282                  file structure and escaping special symbols) but reading and
2283                  parsing of "status" file works slower.
2284                   -- ln
2285               */
2286               char buffer[65];
2287               int len;
2288               len = read(stat_file, buffer, sizeof(buffer) - 1);
2289               if (len >= 0) {
2290                 buffer[len] = 0;
2291                 // Using scanf:
2292                 //     sscanf( buffer, "%*d (%*s) %c ", & state );
2293                 // looks very nice, but searching for a closing parenthesis
2294                 // works a bit faster.
2295                 char *close_parent = strstr(buffer, ") ");
2296                 if (close_parent != NULL) {
2297                   char state = *(close_parent + 2);
2298                   if (state == 'R') {
2299                     ++running_threads;
2300                     if (running_threads >= max) {
2301                       goto finish;
2302                     }
2303                   }
2304                 }
2305               }
2306               close(stat_file);
2307               stat_file = -1;
2308             }
2309           }
2310           task_entry = readdir(task_dir);
2311         }
2312         closedir(task_dir);
2313         task_dir = NULL;
2314       }
2315     }
2316     proc_entry = readdir(proc_dir);
2317   }
2318 
2319   // There _might_ be a timing hole where the thread executing this
2320   // code get skipped in the load balance, and running_threads is 0.
2321   // Assert in the debug builds only!!!
2322   KMP_DEBUG_ASSERT(running_threads > 0);
2323   if (running_threads <= 0) {
2324     running_threads = 1;
2325   }
2326 
2327 finish: // Clean up and exit.
2328   if (proc_dir != NULL) {
2329     closedir(proc_dir);
2330   }
2331   __kmp_str_buf_free(&task_path);
2332   if (task_dir != NULL) {
2333     closedir(task_dir);
2334   }
2335   __kmp_str_buf_free(&stat_path);
2336   if (stat_file != -1) {
2337     close(stat_file);
2338   }
2339 
2340   glb_running_threads = running_threads;
2341 
2342   return running_threads;
2343 
2344 } // __kmp_get_load_balance
2345 
2346 #endif // KMP_OS_DARWIN
2347 
2348 #endif // USE_LOAD_BALANCE
2349 
2350 #if !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_MIC ||                            \
2351       ((KMP_OS_LINUX || KMP_OS_DARWIN) && KMP_ARCH_AARCH64) || KMP_ARCH_PPC64)
2352 
2353 // we really only need the case with 1 argument, because CLANG always build
2354 // a struct of pointers to shared variables referenced in the outlined function
2355 int __kmp_invoke_microtask(microtask_t pkfn, int gtid, int tid, int argc,
2356                            void *p_argv[]
2357 #if OMPT_SUPPORT
2358                            ,
2359                            void **exit_frame_ptr
2360 #endif
2361                            ) {
2362 #if OMPT_SUPPORT
2363   *exit_frame_ptr = OMPT_GET_FRAME_ADDRESS(0);
2364 #endif
2365 
2366   switch (argc) {
2367   default:
2368     fprintf(stderr, "Too many args to microtask: %d!\n", argc);
2369     fflush(stderr);
2370     exit(-1);
2371   case 0:
2372     (*pkfn)(&gtid, &tid);
2373     break;
2374   case 1:
2375     (*pkfn)(&gtid, &tid, p_argv[0]);
2376     break;
2377   case 2:
2378     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1]);
2379     break;
2380   case 3:
2381     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2]);
2382     break;
2383   case 4:
2384     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3]);
2385     break;
2386   case 5:
2387     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4]);
2388     break;
2389   case 6:
2390     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2391             p_argv[5]);
2392     break;
2393   case 7:
2394     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2395             p_argv[5], p_argv[6]);
2396     break;
2397   case 8:
2398     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2399             p_argv[5], p_argv[6], p_argv[7]);
2400     break;
2401   case 9:
2402     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2403             p_argv[5], p_argv[6], p_argv[7], p_argv[8]);
2404     break;
2405   case 10:
2406     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2407             p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9]);
2408     break;
2409   case 11:
2410     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2411             p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10]);
2412     break;
2413   case 12:
2414     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2415             p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2416             p_argv[11]);
2417     break;
2418   case 13:
2419     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2420             p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2421             p_argv[11], p_argv[12]);
2422     break;
2423   case 14:
2424     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2425             p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2426             p_argv[11], p_argv[12], p_argv[13]);
2427     break;
2428   case 15:
2429     (*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2430             p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2431             p_argv[11], p_argv[12], p_argv[13], p_argv[14]);
2432     break;
2433   }
2434 
2435 #if OMPT_SUPPORT
2436   *exit_frame_ptr = 0;
2437 #endif
2438 
2439   return 1;
2440 }
2441 
2442 #endif
2443 
2444 // end of file //
2445