diff --git a/src/os/solaris/vm/os_solaris.cpp b/src/os/solaris/vm/os_solaris.cpp index 68bd830cf1b403b5c001592aa947d684e720e3b3..29e3c01b83276e2e587d1a0d95ce2856ca539f36 100644 --- a/src/os/solaris/vm/os_solaris.cpp +++ b/src/os/solaris/vm/os_solaris.cpp @@ -1488,11 +1488,11 @@ void _handle_uncaught_cxx_exception() { // First crack at OS-specific initialization, from inside the new thread. -void os::initialize_thread() { +void os::initialize_thread(Thread* thr) { int r = thr_main() ; guarantee (r == 0 || r == 1, "CR6501650 or CR6493689") ; if (r) { - JavaThread* jt = (JavaThread *)Thread::current(); + JavaThread* jt = (JavaThread *)thr; assert(jt != NULL,"Sanity check"); size_t stack_size; address base = jt->stack_base(); diff --git a/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp b/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp index c6d31ab4f9ace281d90cb7e2ebc64d431d6ac3db..b7a808e353ef19e0df533ff8f2226e131f9cf315 100644 --- a/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp +++ b/src/os_cpu/bsd_x86/vm/os_bsd_x86.cpp @@ -297,7 +297,7 @@ char* os::non_memory_address_word() { return (char*) -1; } -void os::initialize_thread() { +void os::initialize_thread(Thread* thr) { // Nothing to do. } diff --git a/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp b/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp index 4bb5a8abb2406b2bb346c6895d652655ecde910e..64af2c1f86963131a83a9e4d72583c9bff804f7d 100644 --- a/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp +++ b/src/os_cpu/bsd_zero/vm/os_bsd_zero.cpp @@ -103,7 +103,7 @@ char* os::non_memory_address_word() { #endif // SPARC } -void os::initialize_thread() { +void os::initialize_thread(Thread* thr) { // Nothing to do. } diff --git a/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp b/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp index 11c90e522fc83331666777bc519e2a899b012273..06ab7a7bfb4d71a8d6eae1006f360c4709e917d2 100644 --- a/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp +++ b/src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp @@ -225,7 +225,7 @@ char* os::non_memory_address_word() { return (char*) 0; } -void os::initialize_thread() {} +void os::initialize_thread(Thread* thr) {} void os::print_context(outputStream *st, void *context) { if (context == NULL) return; diff --git a/src/os_cpu/linux_x86/vm/os_linux_x86.cpp b/src/os_cpu/linux_x86/vm/os_linux_x86.cpp index 93bb1f45919baacf91ad0e45fdad44e9d281ff74..1f927850c6661a24704e13f4057c53a027caf530 100644 --- a/src/os_cpu/linux_x86/vm/os_linux_x86.cpp +++ b/src/os_cpu/linux_x86/vm/os_linux_x86.cpp @@ -114,7 +114,7 @@ char* os::non_memory_address_word() { return (char*) -1; } -void os::initialize_thread() { +void os::initialize_thread(Thread* thr) { // Nothing to do. } diff --git a/src/os_cpu/linux_zero/vm/os_linux_zero.cpp b/src/os_cpu/linux_zero/vm/os_linux_zero.cpp index 203090ce07996a5ae3bb12360a15fffd344f9302..edc988ac99633178ba3f334c8885eca8ad59525b 100644 --- a/src/os_cpu/linux_zero/vm/os_linux_zero.cpp +++ b/src/os_cpu/linux_zero/vm/os_linux_zero.cpp @@ -98,7 +98,7 @@ char* os::non_memory_address_word() { #endif // SPARC } -void os::initialize_thread() { +void os::initialize_thread(Thread * thr){ // Nothing to do. } diff --git a/src/os_cpu/windows_x86/vm/os_windows_x86.cpp b/src/os_cpu/windows_x86/vm/os_windows_x86.cpp index 52fe243ee0e7250bfb2b317825e63444461e3c77..88d38f468e0dda8c5e8a326f40fbf6d152ac6e4e 100644 --- a/src/os_cpu/windows_x86/vm/os_windows_x86.cpp +++ b/src/os_cpu/windows_x86/vm/os_windows_x86.cpp @@ -219,7 +219,7 @@ bool os::register_code_area(char *low, char *high) { return true; } -void os::initialize_thread() { +void os::initialize_thread(Thread* thr) { // Nothing to do. } diff --git a/src/share/vm/runtime/os.hpp b/src/share/vm/runtime/os.hpp index 508edba8a3e93f40e81f473c0e33415adbf2b92e..bb5d6ea9e28345cf4587553b5053f823be16b077 100644 --- a/src/share/vm/runtime/os.hpp +++ b/src/share/vm/runtime/os.hpp @@ -387,7 +387,7 @@ class os: AllStatic { static void pd_start_thread(Thread* thread); static void start_thread(Thread* thread); - static void initialize_thread(); + static void initialize_thread(Thread* thr); static void free_thread(OSThread* osthread); // thread id on Linux/64bit is 64bit, on Windows and Solaris, it's 32bit diff --git a/src/share/vm/runtime/thread.cpp b/src/share/vm/runtime/thread.cpp index 500010aa30510c9aa8252ce7ea8350145fcdffb6..f74a61a2602f7cef60f3f67c8abe0cad2f1b0911 100644 --- a/src/share/vm/runtime/thread.cpp +++ b/src/share/vm/runtime/thread.cpp @@ -308,19 +308,25 @@ void Thread::initialize_thread_local_storage() { // initialize structure dependent on thread local storage ThreadLocalStorage::set_thread(this); - - // set up any platform-specific state. - os::initialize_thread(); } void Thread::record_stack_base_and_size() { set_stack_base(os::current_stack_base()); set_stack_size(os::current_stack_size()); + // CR 7190089: on Solaris, primordial thread's stack is adjusted + // in initialize_thread(). Without the adjustment, stack size is + // incorrect if stack is set to unlimited (ulimit -s unlimited). + // So far, only Solaris has real implementation of initialize_thread(). + // + // set up any platform-specific state. + os::initialize_thread(this); - // record thread's native stack, stack grows downward - address low_stack_addr = stack_base() - stack_size(); - MemTracker::record_thread_stack(low_stack_addr, stack_size(), this, - CURRENT_PC); + // record thread's native stack, stack grows downward + if (MemTracker::is_on()) { + address stack_low_addr = stack_base() - stack_size(); + MemTracker::record_thread_stack(stack_low_addr, stack_size(), this, + CURRENT_PC); + } } diff --git a/src/share/vm/services/memTracker.cpp b/src/share/vm/services/memTracker.cpp index befee59858f21a8982f0f72ab9099152b66eb6bc..91c324dfcc6e04076ae1eeb76f15f4316f4617f6 100644 --- a/src/share/vm/services/memTracker.cpp +++ b/src/share/vm/services/memTracker.cpp @@ -341,6 +341,7 @@ void MemTracker::release_thread_recorder(MemRecorder* rec) { */ void MemTracker::create_memory_record(address addr, MEMFLAGS flags, size_t size, address pc, Thread* thread) { + assert(addr != NULL, "Sanity check"); if (!shutdown_in_progress()) { // single thread, we just write records direct to global recorder,' // with any lock diff --git a/src/share/vm/services/memTracker.hpp b/src/share/vm/services/memTracker.hpp index c565e9e072cd45bfceba2a0b4d1cd48101d39dfa..eea28c169d06d2132b63f416dd8bb72e2ff5e5a9 100644 --- a/src/share/vm/services/memTracker.hpp +++ b/src/share/vm/services/memTracker.hpp @@ -185,6 +185,7 @@ class MemTracker : AllStatic { static inline void record_malloc(address addr, size_t size, MEMFLAGS flags, address pc = 0, Thread* thread = NULL) { if (NMT_CAN_TRACK(flags)) { + assert(size > 0, "Sanity check"); create_memory_record(addr, (flags|MemPointerRecord::malloc_tag()), size, pc, thread); } } @@ -198,6 +199,7 @@ class MemTracker : AllStatic { static inline void record_realloc(address old_addr, address new_addr, size_t size, MEMFLAGS flags, address pc = 0, Thread* thread = NULL) { if (is_on()) { + assert(size > 0, "Sanity check"); record_free(old_addr, flags, thread); record_malloc(new_addr, size, flags, pc, thread); } @@ -208,6 +210,7 @@ class MemTracker : AllStatic { // we add a positive offset to arena address, so we can have arena size record // sorted after arena record if (is_on() && !UseMallocOnly) { + assert(addr != NULL, "Sanity check"); create_memory_record((addr + sizeof(void*)), MemPointerRecord::arena_size_tag(), size, 0, NULL); } @@ -217,7 +220,7 @@ class MemTracker : AllStatic { static inline void record_virtual_memory_reserve(address addr, size_t size, address pc = 0, Thread* thread = NULL) { if (is_on()) { - assert(size > 0, "reserve szero size"); + assert(size > 0, "Sanity check"); create_memory_record(addr, MemPointerRecord::virtual_memory_reserve_tag(), size, pc, thread); } @@ -248,6 +251,7 @@ class MemTracker : AllStatic { static inline void record_virtual_memory_commit(address addr, size_t size, address pc = 0, Thread* thread = NULL) { if (is_on()) { + assert(size > 0, "Sanity check"); create_memory_record(addr, MemPointerRecord::virtual_memory_commit_tag(), size, DEBUG_CALLER_PC, thread); } @@ -257,6 +261,7 @@ class MemTracker : AllStatic { static inline void record_virtual_memory_uncommit(address addr, size_t size, Thread* thread = NULL) { if (is_on()) { + assert(size > 0, "Sanity check"); create_memory_record(addr, MemPointerRecord::virtual_memory_uncommit_tag(), size, DEBUG_CALLER_PC, thread); } @@ -266,6 +271,7 @@ class MemTracker : AllStatic { static inline void record_virtual_memory_release(address addr, size_t size, Thread* thread = NULL) { if (is_on()) { + assert(size > 0, "Sanity check"); create_memory_record(addr, MemPointerRecord::virtual_memory_release_tag(), size, DEBUG_CALLER_PC, thread); }