8218565: HandleMark cleanup

Reviewed-by: coleenp, kbarrett, rehn
This commit is contained in:
Claes Redestad 2019-02-07 10:26:32 +01:00
parent 31e3c0800c
commit 551a272ced
3 changed files with 21 additions and 39 deletions

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2019, 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
@ -26,7 +26,6 @@
#include "memory/allocation.inline.hpp"
#include "oops/constantPool.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/atomic.hpp"
#include "runtime/handles.inline.hpp"
#include "runtime/thread.inline.hpp"
@ -102,9 +101,6 @@ static uintx chunk_oops_do(OopClosure* f, Chunk* chunk, char* chunk_top) {
return handles_visited;
}
// Used for debugging handle allocation.
NOT_PRODUCT(jint _nof_handlemarks = 0;)
void HandleArea::oops_do(OopClosure* f) {
uintx handles_visited = 0;
// First handle the current chunk. It is filled to the high water mark.
@ -130,46 +126,35 @@ void HandleMark::initialize(Thread* thread) {
_size_in_bytes = _area->_size_in_bytes;
debug_only(_area->_handle_mark_nesting++);
assert(_area->_handle_mark_nesting > 0, "must stack allocate HandleMarks");
debug_only(Atomic::inc(&_nof_handlemarks);)
// Link this in the thread
set_previous_handle_mark(thread->last_handle_mark());
thread->set_last_handle_mark(this);
}
HandleMark::~HandleMark() {
HandleArea* area = _area; // help compilers with poor alias analysis
assert(area == _thread->handle_area(), "sanity check");
assert(area->_handle_mark_nesting > 0, "must stack allocate HandleMarks" );
debug_only(area->_handle_mark_nesting--);
assert(_area == _thread->handle_area(), "sanity check");
assert(_area->_handle_mark_nesting > 0, "must stack allocate HandleMarks" );
// Delete later chunks
if( _chunk->next() ) {
// reset arena size before delete chunks. Otherwise, the total
// arena size could exceed total chunk size
assert(area->size_in_bytes() > size_in_bytes(), "Sanity check");
area->set_size_in_bytes(size_in_bytes());
_chunk->next_chop();
} else {
assert(area->size_in_bytes() == size_in_bytes(), "Sanity check");
}
// Roll back arena to saved top markers
area->_chunk = _chunk;
area->_hwm = _hwm;
area->_max = _max;
pop_and_restore();
#ifdef ASSERT
// clear out first chunk (to detect allocation bugs)
if (ZapVMHandleArea) {
memset(_hwm, badHandleValue, _max - _hwm);
}
Atomic::dec(&_nof_handlemarks);
#endif
// Unlink this from the thread
_thread->set_last_handle_mark(previous_handle_mark());
}
void HandleMark::chop_later_chunks() {
// reset arena size before delete chunks. Otherwise, the total
// arena size could exceed total chunk size
_area->set_size_in_bytes(size_in_bytes());
_chunk->next_chop();
}
void* HandleMark::operator new(size_t size) throw() {
return AllocateHeap(size, mtThread);
}

View File

@ -253,6 +253,8 @@ class HandleMark {
HandleMark* previous_handle_mark() const { return _previous_handle_mark; }
size_t size_in_bytes() const { return _size_in_bytes; }
// remove all chunks beginning with the next
void chop_later_chunks();
public:
HandleMark(); // see handles_inline.hpp
HandleMark(Thread* thread) { initialize(thread); }

View File

@ -79,7 +79,6 @@ inline HandleMark::HandleMark() {
initialize(Thread::current());
}
inline void HandleMark::push() {
// This is intentionally a NOP. pop_and_restore will reset
// values to the HandleMark further down the stack, typically
@ -88,22 +87,18 @@ inline void HandleMark::push() {
}
inline void HandleMark::pop_and_restore() {
HandleArea* area = _area; // help compilers with poor alias analysis
// Delete later chunks
if( _chunk->next() ) {
// reset arena size before delete chunks. Otherwise, the total
// arena size could exceed total chunk size
assert(area->size_in_bytes() > size_in_bytes(), "Sanity check");
area->set_size_in_bytes(size_in_bytes());
_chunk->next_chop();
if(_chunk->next() != NULL) {
assert(_area->size_in_bytes() > size_in_bytes(), "Sanity check");
chop_later_chunks();
} else {
assert(area->size_in_bytes() == size_in_bytes(), "Sanity check");
assert(_area->size_in_bytes() == size_in_bytes(), "Sanity check");
}
// Roll back arena to saved top markers
area->_chunk = _chunk;
area->_hwm = _hwm;
area->_max = _max;
debug_only(area->_handle_mark_nesting--);
_area->_chunk = _chunk;
_area->_hwm = _hwm;
_area->_max = _max;
debug_only(_area->_handle_mark_nesting--);
}
inline HandleMarkCleaner::HandleMarkCleaner(Thread* thread) {