| | 653 | #if defined(Q_OS_MAC) && !defined(Q_OS_IOS) |
| | 654 | if (d->stackSize == 0) { |
| | 655 | // Fix the default (too small) stack size for threads on OS X, |
| | 656 | // which also affects the thread pool. |
| | 657 | // See also: |
| | 658 | // https://bugreports.qt.io/browse/QTBUG-2568 |
| | 659 | // This fix can also be found in Chromium: |
| | 660 | // https://chromium.googlesource.com/chromium/src.git/+/master/base/threading/platform_thread_mac.mm#186 |
| | 661 | |
| | 662 | // The Mac OS X default for a pthread stack size is 512kB. |
| | 663 | // Libc-594.1.4/pthreads/pthread.c's pthread_attr_init uses |
| | 664 | // DEFAULT_STACK_SIZE for this purpose. |
| | 665 | // |
| | 666 | // 512kB isn't quite generous enough for some deeply recursive threads that |
| | 667 | // otherwise request the default stack size by specifying 0. Here, adopt |
| | 668 | // glibc's behavior as on Linux, which is to use the current stack size |
| | 669 | // limit (ulimit -s) as the default stack size. See |
| | 670 | // glibc-2.11.1/nptl/nptl-init.c's __pthread_initialize_minimal_internal. To |
| | 671 | // avoid setting the limit below the Mac OS X default or the minimum usable |
| | 672 | // stack size, these values are also considered. If any of these values |
| | 673 | // can't be determined, or if stack size is unlimited (ulimit -s unlimited), |
| | 674 | // stack_size is left at 0 to get the system default. |
| | 675 | // |
| | 676 | // Mac OS X normally only applies ulimit -s to the main thread stack. On |
| | 677 | // contemporary OS X and Linux systems alike, this value is generally 8MB |
| | 678 | // or in that neighborhood. |
| | 679 | size_t default_stack_size = 0; |
| | 680 | struct rlimit stack_rlimit; |
| | 681 | if (pthread_attr_getstacksize(&attributes, &default_stack_size) == 0 && |
| | 682 | getrlimit(RLIMIT_STACK, &stack_rlimit) == 0 && |
| | 683 | stack_rlimit.rlim_cur != RLIM_INFINITY) { |
| | 684 | default_stack_size = |
| | 685 | std::max(std::max(default_stack_size, |
| | 686 | static_cast<size_t>(PTHREAD_STACK_MIN)), |
| | 687 | static_cast<size_t>(stack_rlimit.rlim_cur)); |
| | 688 | } |
| | 689 | d->stackSize = default_stack_size; |
| | 690 | } |
| | 691 | #endif |