307 void Thread::record_stack_base_and_size() { 308 set_stack_base(os::current_stack_base()); 309 set_stack_size(os::current_stack_size()); 310 // CR 7190089: on Solaris, primordial thread's stack is adjusted 311 // in initialize_thread(). Without the adjustment, stack size is 312 // incorrect if stack is set to unlimited (ulimit -s unlimited). 313 // So far, only Solaris has real implementation of initialize_thread(). 314 // 315 // set up any platform-specific state. 316 os::initialize_thread(this); 317 318 // Set stack limits after thread is initialized. 319 if (is_Java_thread()) { 320 ((JavaThread*) this)->set_stack_overflow_limit(); 321 ((JavaThread*) this)->set_reserved_stack_activation(stack_base()); 322 } 323 #if INCLUDE_NMT 324 // record thread's native stack, stack grows downward 325 MemTracker::record_thread_stack(stack_end(), stack_size()); 326 #endif // INCLUDE_NMT 327 } 328 329 330 Thread::~Thread() { 331 // Reclaim the objectmonitors from the omFreeList of the moribund thread. 332 ObjectSynchronizer::omFlush(this); 333 334 EVENT_THREAD_DESTRUCT(this); 335 336 // stack_base can be NULL if the thread is never started or exited before 337 // record_stack_base_and_size called. Although, we would like to ensure 338 // that all started threads do call record_stack_base_and_size(), there is 339 // not proper way to enforce that. 340 #if INCLUDE_NMT 341 if (_stack_base != NULL) { 342 MemTracker::release_thread_stack(stack_end(), stack_size()); 343 #ifdef ASSERT 344 set_stack_base(NULL); 345 #endif 346 } 1785 jio_fprintf(defaultStream::error_stream(), 1786 "\nException: %s thrown from the UncaughtExceptionHandler" 1787 " in thread \"%s\"\n", 1788 pending_exception()->klass()->external_name(), 1789 get_thread_name()); 1790 CLEAR_PENDING_EXCEPTION; 1791 } 1792 } 1793 1794 // Called before the java thread exit since we want to read info 1795 // from java_lang_Thread object 1796 EventThreadEnd event; 1797 if (event.should_commit()) { 1798 event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj())); 1799 event.commit(); 1800 } 1801 1802 // Call after last event on thread 1803 EVENT_THREAD_EXIT(this); 1804 1805 // Call Thread.exit(). We try 3 times in case we got another Thread.stop during 1806 // the execution of the method. If that is not enough, then we don't really care. Thread.stop 1807 // is deprecated anyhow. 1808 if (!is_Compiler_thread()) { 1809 int count = 3; 1810 while (java_lang_Thread::threadGroup(threadObj()) != NULL && (count-- > 0)) { 1811 EXCEPTION_MARK; 1812 JavaValue result(T_VOID); 1813 KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass()); 1814 JavaCalls::call_virtual(&result, 1815 threadObj, thread_klass, 1816 vmSymbols::exit_method_name(), 1817 vmSymbols::void_method_signature(), 1818 THREAD); 1819 CLEAR_PENDING_EXCEPTION; 1820 } 1821 } 1822 // notify JVMTI 1823 if (JvmtiExport::should_post_thread_life()) { 1824 JvmtiExport::post_thread_end(this); 2474 if (is_ext_suspended()) { 2475 clear_ext_suspended(); 2476 SR_lock()->notify_all(); 2477 } 2478 } 2479 2480 size_t JavaThread::_stack_red_zone_size = 0; 2481 size_t JavaThread::_stack_yellow_zone_size = 0; 2482 size_t JavaThread::_stack_reserved_zone_size = 0; 2483 size_t JavaThread::_stack_shadow_zone_size = 0; 2484 2485 void JavaThread::create_stack_guard_pages() { 2486 if (!os::uses_stack_guard_pages() || _stack_guard_state != stack_guard_unused) { return; } 2487 address low_addr = stack_end(); 2488 size_t len = stack_guard_zone_size(); 2489 2490 int allocate = os::allocate_stack_guard_pages(); 2491 // warning("Guarding at " PTR_FORMAT " for len " SIZE_FORMAT "\n", low_addr, len); 2492 2493 if (allocate && !os::create_stack_guard_pages((char *) low_addr, len)) { 2494 warning("Attempt to allocate stack guard pages failed."); 2495 return; 2496 } 2497 2498 if (os::guard_memory((char *) low_addr, len)) { 2499 _stack_guard_state = stack_guard_enabled; 2500 } else { 2501 warning("Attempt to protect stack guard pages failed."); 2502 if (os::uncommit_memory((char *) low_addr, len)) { 2503 warning("Attempt to deallocate stack guard pages failed."); 2504 } 2505 } 2506 } 2507 2508 void JavaThread::remove_stack_guard_pages() { 2509 assert(Thread::current() == this, "from different thread"); 2510 if (_stack_guard_state == stack_guard_unused) return; 2511 address low_addr = stack_end(); 2512 size_t len = stack_guard_zone_size(); 2513 2514 if (os::allocate_stack_guard_pages()) { 2515 if (os::remove_stack_guard_pages((char *) low_addr, len)) { 2516 _stack_guard_state = stack_guard_unused; 2517 } else { 2518 warning("Attempt to deallocate stack guard pages failed."); 2519 } 2520 } else { 2521 if (_stack_guard_state == stack_guard_unused) return; 2522 if (os::unguard_memory((char *) low_addr, len)) { 2523 _stack_guard_state = stack_guard_unused; 2524 } else { 2525 warning("Attempt to unprotect stack guard pages failed."); 2526 } 2527 } 2528 } 2529 2530 void JavaThread::enable_stack_reserved_zone() { 2531 assert(_stack_guard_state != stack_guard_unused, "must be using guard pages."); 2532 assert(_stack_guard_state != stack_guard_enabled, "already enabled"); 2533 2534 // The base notation is from the stack's point of view, growing downward. 2535 // We need to adjust it to work correctly with guard_memory() 2536 address base = stack_reserved_zone_base() - stack_reserved_zone_size(); 2537 2538 guarantee(base < stack_base(),"Error calculating stack reserved zone"); 2539 guarantee(base < os::current_stack_pointer(),"Error calculating stack reserved zone"); 2540 2541 if (os::guard_memory((char *) base, stack_reserved_zone_size())) { 2542 _stack_guard_state = stack_guard_enabled; 2543 } else { 2544 warning("Attempt to guard stack reserved zone failed."); 2545 } 2546 enable_register_stack_guard(); 2547 } | 307 void Thread::record_stack_base_and_size() { 308 set_stack_base(os::current_stack_base()); 309 set_stack_size(os::current_stack_size()); 310 // CR 7190089: on Solaris, primordial thread's stack is adjusted 311 // in initialize_thread(). Without the adjustment, stack size is 312 // incorrect if stack is set to unlimited (ulimit -s unlimited). 313 // So far, only Solaris has real implementation of initialize_thread(). 314 // 315 // set up any platform-specific state. 316 os::initialize_thread(this); 317 318 // Set stack limits after thread is initialized. 319 if (is_Java_thread()) { 320 ((JavaThread*) this)->set_stack_overflow_limit(); 321 ((JavaThread*) this)->set_reserved_stack_activation(stack_base()); 322 } 323 #if INCLUDE_NMT 324 // record thread's native stack, stack grows downward 325 MemTracker::record_thread_stack(stack_end(), stack_size()); 326 #endif // INCLUDE_NMT 327 log_debug(os)("Thread " UINTX_FORMAT " stack dimensions: " 328 PTR_FORMAT "-" PTR_FORMAT " (" SIZE_FORMAT "k).", 329 os::current_thread_id(), p2i(stack_base() - stack_size()), 330 p2i(stack_base()), stack_size()/1024); 331 } 332 333 334 Thread::~Thread() { 335 // Reclaim the objectmonitors from the omFreeList of the moribund thread. 336 ObjectSynchronizer::omFlush(this); 337 338 EVENT_THREAD_DESTRUCT(this); 339 340 // stack_base can be NULL if the thread is never started or exited before 341 // record_stack_base_and_size called. Although, we would like to ensure 342 // that all started threads do call record_stack_base_and_size(), there is 343 // not proper way to enforce that. 344 #if INCLUDE_NMT 345 if (_stack_base != NULL) { 346 MemTracker::release_thread_stack(stack_end(), stack_size()); 347 #ifdef ASSERT 348 set_stack_base(NULL); 349 #endif 350 } 1789 jio_fprintf(defaultStream::error_stream(), 1790 "\nException: %s thrown from the UncaughtExceptionHandler" 1791 " in thread \"%s\"\n", 1792 pending_exception()->klass()->external_name(), 1793 get_thread_name()); 1794 CLEAR_PENDING_EXCEPTION; 1795 } 1796 } 1797 1798 // Called before the java thread exit since we want to read info 1799 // from java_lang_Thread object 1800 EventThreadEnd event; 1801 if (event.should_commit()) { 1802 event.set_javalangthread(java_lang_Thread::thread_id(this->threadObj())); 1803 event.commit(); 1804 } 1805 1806 // Call after last event on thread 1807 EVENT_THREAD_EXIT(this); 1808 1809 log_debug(os)("Thread " UINTX_FORMAT " %s.", 1810 os::current_thread_id(), 1811 exit_type == JavaThread::normal_exit ? "exiting" : "detaching"); 1812 1813 // Call Thread.exit(). We try 3 times in case we got another Thread.stop during 1814 // the execution of the method. If that is not enough, then we don't really care. Thread.stop 1815 // is deprecated anyhow. 1816 if (!is_Compiler_thread()) { 1817 int count = 3; 1818 while (java_lang_Thread::threadGroup(threadObj()) != NULL && (count-- > 0)) { 1819 EXCEPTION_MARK; 1820 JavaValue result(T_VOID); 1821 KlassHandle thread_klass(THREAD, SystemDictionary::Thread_klass()); 1822 JavaCalls::call_virtual(&result, 1823 threadObj, thread_klass, 1824 vmSymbols::exit_method_name(), 1825 vmSymbols::void_method_signature(), 1826 THREAD); 1827 CLEAR_PENDING_EXCEPTION; 1828 } 1829 } 1830 // notify JVMTI 1831 if (JvmtiExport::should_post_thread_life()) { 1832 JvmtiExport::post_thread_end(this); 2482 if (is_ext_suspended()) { 2483 clear_ext_suspended(); 2484 SR_lock()->notify_all(); 2485 } 2486 } 2487 2488 size_t JavaThread::_stack_red_zone_size = 0; 2489 size_t JavaThread::_stack_yellow_zone_size = 0; 2490 size_t JavaThread::_stack_reserved_zone_size = 0; 2491 size_t JavaThread::_stack_shadow_zone_size = 0; 2492 2493 void JavaThread::create_stack_guard_pages() { 2494 if (!os::uses_stack_guard_pages() || _stack_guard_state != stack_guard_unused) { return; } 2495 address low_addr = stack_end(); 2496 size_t len = stack_guard_zone_size(); 2497 2498 int allocate = os::allocate_stack_guard_pages(); 2499 // warning("Guarding at " PTR_FORMAT " for len " SIZE_FORMAT "\n", low_addr, len); 2500 2501 if (allocate && !os::create_stack_guard_pages((char *) low_addr, len)) { 2502 log_warning(os)("Attempt to allocate stack guard pages failed."); 2503 return; 2504 } 2505 2506 if (os::guard_memory((char *) low_addr, len)) { 2507 _stack_guard_state = stack_guard_enabled; 2508 } else { 2509 log_warning(os)("Attempt to protect stack guard pages failed (" 2510 PTR_FORMAT "-" PTR_FORMAT ").", p2i(low_addr), p2i(low_addr + len)); 2511 if (os::uncommit_memory((char *) low_addr, len)) { 2512 log_warning(os)("Attempt to deallocate stack guard pages failed."); 2513 } 2514 return; 2515 } 2516 2517 log_debug(os)("Thread " UINTX_FORMAT " stack guard pages activated: " 2518 PTR_FORMAT "-" PTR_FORMAT ".", 2519 os::current_thread_id(), p2i(low_addr), p2i(low_addr + len)); 2520 2521 } 2522 2523 void JavaThread::remove_stack_guard_pages() { 2524 assert(Thread::current() == this, "from different thread"); 2525 if (_stack_guard_state == stack_guard_unused) return; 2526 address low_addr = stack_end(); 2527 size_t len = stack_guard_zone_size(); 2528 2529 if (os::allocate_stack_guard_pages()) { 2530 if (os::remove_stack_guard_pages((char *) low_addr, len)) { 2531 _stack_guard_state = stack_guard_unused; 2532 } else { 2533 log_warning(os)("Attempt to deallocate stack guard pages failed (" 2534 PTR_FORMAT "-" PTR_FORMAT ").", p2i(low_addr), p2i(low_addr + len)); 2535 return; 2536 } 2537 } else { 2538 if (_stack_guard_state == stack_guard_unused) return; 2539 if (os::unguard_memory((char *) low_addr, len)) { 2540 _stack_guard_state = stack_guard_unused; 2541 } else { 2542 log_warning(os)("Attempt to unprotect stack guard pages failed (" 2543 PTR_FORMAT "-" PTR_FORMAT ").", p2i(low_addr), p2i(low_addr + len)); 2544 return; 2545 } 2546 } 2547 2548 log_debug(os)("Thread " UINTX_FORMAT " stack guard pages removed: " 2549 PTR_FORMAT "-" PTR_FORMAT ".", 2550 os::current_thread_id(), p2i(low_addr), p2i(low_addr + len)); 2551 2552 } 2553 2554 void JavaThread::enable_stack_reserved_zone() { 2555 assert(_stack_guard_state != stack_guard_unused, "must be using guard pages."); 2556 assert(_stack_guard_state != stack_guard_enabled, "already enabled"); 2557 2558 // The base notation is from the stack's point of view, growing downward. 2559 // We need to adjust it to work correctly with guard_memory() 2560 address base = stack_reserved_zone_base() - stack_reserved_zone_size(); 2561 2562 guarantee(base < stack_base(),"Error calculating stack reserved zone"); 2563 guarantee(base < os::current_stack_pointer(),"Error calculating stack reserved zone"); 2564 2565 if (os::guard_memory((char *) base, stack_reserved_zone_size())) { 2566 _stack_guard_state = stack_guard_enabled; 2567 } else { 2568 warning("Attempt to guard stack reserved zone failed."); 2569 } 2570 enable_register_stack_guard(); 2571 } |