< prev index next >

src/os_cpu/linux_x86/vm/os_linux_x86.cpp

Print this page
rev 12334 : 8169373: Work around linux NPTL stack guard error.
Summary: Also skip OS guard page for compiler thread, merge similar code on linux platforms, and streamline OS guard page handling on linuxs390, linuxppc, aixppc.
Reviewed-by: dholmes

*** 696,790 **** size_t s = (thr_type == os::compiler_thread ? 2 * M : 512 * K); #endif // AMD64 return s; } - size_t os::Linux::default_guard_size(os::ThreadType thr_type) { - // Creating guard page is very expensive. Java thread has HotSpot - // guard page, only enable glibc guard page for non-Java threads. - return (thr_type == java_thread ? 0 : page_size()); - } - - // Java thread: - // - // Low memory addresses - // +------------------------+ - // | |\ JavaThread created by VM does not have glibc - // | glibc guard page | - guard, attached Java thread usually has - // | |/ 1 page glibc guard. - // P1 +------------------------+ Thread::stack_base() - Thread::stack_size() - // | |\ - // | HotSpot Guard Pages | - red and yellow pages - // | |/ - // +------------------------+ JavaThread::stack_yellow_zone_base() - // | |\ - // | Normal Stack | - - // | |/ - // P2 +------------------------+ Thread::stack_base() - // - // Non-Java thread: - // - // Low memory addresses - // +------------------------+ - // | |\ - // | glibc guard page | - usually 1 page - // | |/ - // P1 +------------------------+ Thread::stack_base() - Thread::stack_size() - // | |\ - // | Normal Stack | - - // | |/ - // P2 +------------------------+ Thread::stack_base() - // - // ** P1 (aka bottom) and size ( P2 = P1 - size) are the address and stack size returned from - // pthread_attr_getstack() - - static void current_stack_region(address * bottom, size_t * size) { - if (os::Linux::is_initial_thread()) { - // initial thread needs special handling because pthread_getattr_np() - // may return bogus value. - *bottom = os::Linux::initial_thread_stack_bottom(); - *size = os::Linux::initial_thread_stack_size(); - } else { - pthread_attr_t attr; - - int rslt = pthread_getattr_np(pthread_self(), &attr); - - // JVM needs to know exact stack location, abort if it fails - if (rslt != 0) { - if (rslt == ENOMEM) { - vm_exit_out_of_memory(0, OOM_MMAP_ERROR, "pthread_getattr_np"); - } else { - fatal("pthread_getattr_np failed with errno = %d", rslt); - } - } - - if (pthread_attr_getstack(&attr, (void **)bottom, size) != 0) { - fatal("Can not locate current stack attributes!"); - } - - pthread_attr_destroy(&attr); - - } - assert(os::current_stack_pointer() >= *bottom && - os::current_stack_pointer() < *bottom + *size, "just checking"); - } - - address os::current_stack_base() { - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return (bottom + size); - } - - size_t os::current_stack_size() { - // stack size includes normal stack and HotSpot guard pages - address bottom; - size_t size; - current_stack_region(&bottom, &size); - return size; - } - ///////////////////////////////////////////////////////////////////////////// // helper functions for fatal error handler void os::print_context(outputStream *st, const void *context) { if (context == NULL) return; --- 696,705 ----
< prev index next >