< prev index next >

src/os/solaris/vm/os_solaris.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 198,218 **** assert((address)&st < (address)st.ss_sp, "Invalid stack base returned"); assert((address)&st > (address)st.ss_sp-st.ss_size, "Invalid stack size returned"); return st; } ! address os::current_stack_base() { int r = thr_main() ; guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ; ! bool is_primordial_thread = r; // Workaround 4352906, avoid calls to thr_stksegment by // thr_main after the first one (it looks like we trash // some data, causing the value for ss_sp to be incorrect). ! if (!is_primordial_thread || os::Solaris::_main_stack_base == NULL) { stack_t st = get_stack_info(); ! if (is_primordial_thread) { // cache initial value of stack base os::Solaris::_main_stack_base = (address)st.ss_sp; } return (address)st.ss_sp; } else { --- 198,222 ---- assert((address)&st < (address)st.ss_sp, "Invalid stack base returned"); assert((address)&st > (address)st.ss_sp-st.ss_size, "Invalid stack size returned"); return st; } ! bool os::is_primordial_thread(void) { int r = thr_main() ; guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ; ! return r == 1; ! } ! ! address os::current_stack_base() { ! bool _is_primordial_thread = is_primordial_thread(); // Workaround 4352906, avoid calls to thr_stksegment by // thr_main after the first one (it looks like we trash // some data, causing the value for ss_sp to be incorrect). ! if (!_is_primordial_thread || os::Solaris::_main_stack_base == NULL) { stack_t st = get_stack_info(); ! if (_is_primordial_thread) { // cache initial value of stack base os::Solaris::_main_stack_base = (address)st.ss_sp; } return (address)st.ss_sp; } else {
*** 222,234 **** } size_t os::current_stack_size() { size_t size; ! int r = thr_main() ; ! guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ; ! if(!r) { size = get_stack_info().ss_size; } else { struct rlimit limits; getrlimit(RLIMIT_STACK, &limits); size = adjust_stack_size(os::Solaris::_main_stack_base, (size_t)limits.rlim_cur); --- 226,236 ---- } size_t os::current_stack_size() { size_t size; ! if (!is_primordial_thread()) { size = get_stack_info().ss_size; } else { struct rlimit limits; getrlimit(RLIMIT_STACK, &limits); size = adjust_stack_size(os::Solaris::_main_stack_base, (size_t)limits.rlim_cur);
*** 1275,1287 **** } // First crack at OS-specific initialization, from inside the new thread. void os::initialize_thread(Thread* thr) { ! int r = thr_main() ; ! guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ; ! if (r) { JavaThread* jt = (JavaThread *)thr; assert(jt != NULL,"Sanity check"); size_t stack_size; address base = jt->stack_base(); if (Arguments::created_by_java_launcher()) { --- 1277,1287 ---- } // First crack at OS-specific initialization, from inside the new thread. void os::initialize_thread(Thread* thr) { ! if (is_primordial_thread()) { JavaThread* jt = (JavaThread *)thr; assert(jt != NULL,"Sanity check"); size_t stack_size; address base = jt->stack_base(); if (Arguments::created_by_java_launcher()) {
*** 4902,4911 **** --- 4902,4912 ---- dladdr1_func = CAST_TO_FN_PTR(dladdr1_func_type, dlsym(hdl, "dladdr1")); // (Solaris only) this switches to calls that actually do locking. ThreadCritical::initialize(); + // main_thread points to the thread that created/loaded the JVM. main_thread = thr_self(); // Constant minimum stack size allowed. It must be at least // the minimum of what the OS supports (thr_min_stack()), and // enough to allow the thread to get to user bytecode execution.
< prev index next >