aboutsummaryrefslogtreecommitdiff
path: root/src/share
diff options
context:
space:
mode:
authorcoleenp <none@none>2012-11-20 20:27:40 -0500
committercoleenp <none@none>2012-11-20 20:27:40 -0500
commitd8df9cb312be5c20ae4efa4b1eedbb4e0f759c1d (patch)
tree67e6c3be48548d625b937e60e8f04c6e0c1844ec /src/share
parent91abeeafb9f52b68ebe78c24ad2b87b3c186c75d (diff)
parent1b7330b733ae72a809b5c4a269689ecb1b63b872 (diff)
Merge
Diffstat (limited to 'src/share')
-rw-r--r--src/share/vm/services/memSnapshot.cpp18
-rw-r--r--src/share/vm/services/memSnapshot.hpp17
2 files changed, 29 insertions, 6 deletions
diff --git a/src/share/vm/services/memSnapshot.cpp b/src/share/vm/services/memSnapshot.cpp
index 92c407615..c293542f7 100644
--- a/src/share/vm/services/memSnapshot.cpp
+++ b/src/share/vm/services/memSnapshot.cpp
@@ -261,17 +261,19 @@ bool VMMemPointerIterator::remove_released_region(MemPointerRecord* rec) {
VMMemRegion* cur = (VMMemRegion*)current();
assert(cur->is_reserved_region() && cur->contains_region(rec),
"Sanity check");
+ if (rec->is_same_region(cur)) {
+ // release whole reserved region
#ifdef ASSERT
- VMMemRegion* next_reg = (VMMemRegion*)peek_next();
- // should not have any committed memory in this reserved region
- assert(next_reg == NULL || !next_reg->is_committed_region(), "Sanity check");
+ VMMemRegion* next_region = (VMMemRegion*)peek_next();
+ // should not have any committed memory in this reserved region
+ assert(next_region == NULL || !next_region->is_committed_region(), "Sanity check");
#endif
- if (rec->is_same_region(cur)) {
remove();
} else if (rec->addr() == cur->addr() ||
rec->addr() + rec->size() == cur->addr() + cur->size()) {
// released region is at either end of this region
cur->exclude_region(rec->addr(), rec->size());
+ assert(check_reserved_region(), "Integrity check");
} else { // split the reserved region and release the middle
address high_addr = cur->addr() + cur->size();
size_t sz = high_addr - rec->addr();
@@ -280,10 +282,14 @@ bool VMMemPointerIterator::remove_released_region(MemPointerRecord* rec) {
if (MemTracker::track_callsite()) {
MemPointerRecordEx tmp(rec->addr() + rec->size(), cur->flags(), sz,
((VMMemRegionEx*)cur)->pc());
- return insert_reserved_region(&tmp);
+ bool ret = insert_reserved_region(&tmp);
+ assert(!ret || check_reserved_region(), "Integrity check");
+ return ret;
} else {
MemPointerRecord tmp(rec->addr() + rec->size(), cur->flags(), sz);
- return insert_reserved_region(&tmp);
+ bool ret = insert_reserved_region(&tmp);
+ assert(!ret || check_reserved_region(), "Integrity check");
+ return ret;
}
}
return true;
diff --git a/src/share/vm/services/memSnapshot.hpp b/src/share/vm/services/memSnapshot.hpp
index 1620c5454..5755108c0 100644
--- a/src/share/vm/services/memSnapshot.hpp
+++ b/src/share/vm/services/memSnapshot.hpp
@@ -146,6 +146,23 @@ class VMMemPointerIterator : public MemPointerIterator {
// reset current position
inline void reset() { _pos = 0; }
#ifdef ASSERT
+ // check integrity of records on current reserved memory region.
+ bool check_reserved_region() {
+ VMMemRegion* reserved_region = (VMMemRegion*)current();
+ assert(reserved_region != NULL && reserved_region->is_reserved_region(),
+ "Sanity check");
+ // all committed regions that follow current reserved region, should all
+ // belong to the reserved region.
+ VMMemRegion* next_region = (VMMemRegion*)next();
+ for (; next_region != NULL && next_region->is_committed_region();
+ next_region = (VMMemRegion*)next() ) {
+ if(!reserved_region->contains_region(next_region)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
virtual bool is_dup_pointer(const MemPointer* ptr1,
const MemPointer* ptr2) const {
VMMemRegion* p1 = (VMMemRegion*)ptr1;