< 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 >