comparison src/share/vm/runtime/thread.cpp @ 6745:6dfc6a541338

7198529: NPG: assert with NMT code in Thread destructor Summary: Thread stack's base address can be NULL if it is not started or exited before recording the base Reviewed-by: kvn, fparain
author zgu
date Fri, 14 Sep 2012 12:55:50 -0400
parents 33143ee07800
children a7509aff1b06 716e6ef4482a
comparison
equal deleted inserted replaced
6744:7edbe32b9802 6745:6dfc6a541338
326 326
327 Thread::~Thread() { 327 Thread::~Thread() {
328 // Reclaim the objectmonitors from the omFreeList of the moribund thread. 328 // Reclaim the objectmonitors from the omFreeList of the moribund thread.
329 ObjectSynchronizer::omFlush (this) ; 329 ObjectSynchronizer::omFlush (this) ;
330 330
331 address low_stack_addr = stack_base() - stack_size(); 331 // stack_base can be NULL if the thread is never started or exited before
332 MemTracker::release_thread_stack(low_stack_addr, stack_size(), this); 332 // record_stack_base_and_size called. Although, we would like to ensure
333 // that all started threads do call record_stack_base_and_size(), there is
334 // not proper way to enforce that.
335 if (_stack_base != NULL) {
336 address low_stack_addr = stack_base() - stack_size();
337 MemTracker::release_thread_stack(low_stack_addr, stack_size(), this);
338 }
333 339
334 // deallocate data structures 340 // deallocate data structures
335 delete resource_area(); 341 delete resource_area();
336 // since the handle marks are using the handle area, we have to deallocated the root 342 // since the handle marks are using the handle area, we have to deallocated the root
337 // handle mark before deallocating the thread's handle area, 343 // handle mark before deallocating the thread's handle area,