comparison src/share/vm/services/memRecorder.cpp @ 10986:1f4355cee9a2

8013651: NMT: reserve/release sequence id's in incorrect order due to race Summary: Fixed NMT race condition for realloc, uncommit and release Reviewed-by: coleenp, ccheung
author zgu
date Tue, 18 Jun 2013 08:44:08 -0400
parents 4102b59539ce
children
comparison
equal deleted inserted replaced
10984:cd2118b62475 10986:1f4355cee9a2
1 /* 1 /*
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
67 _next = NULL; 67 _next = NULL;
68 68
69 69
70 if (_pointer_records != NULL) { 70 if (_pointer_records != NULL) {
71 // recode itself 71 // recode itself
72 address pc = CURRENT_PC;
72 record((address)this, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder), 73 record((address)this, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder),
73 sizeof(MemRecorder), CALLER_PC); 74 sizeof(MemRecorder), SequenceGenerator::next(), pc);
74 record((address)_pointer_records, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder), 75 record((address)_pointer_records, (MemPointerRecord::malloc_tag()|mtNMT|otNMTRecorder),
75 _pointer_records->instance_size(),CURRENT_PC); 76 _pointer_records->instance_size(), SequenceGenerator::next(), pc);
76 } 77 }
77 } 78 }
78 79
79 MemRecorder::~MemRecorder() { 80 MemRecorder::~MemRecorder() {
80 if (_pointer_records != NULL) { 81 if (_pointer_records != NULL) {
114 } else { 115 } else {
115 return delta; 116 return delta;
116 } 117 }
117 } 118 }
118 119
119 bool MemRecorder::record(address p, MEMFLAGS flags, size_t size, address pc) { 120 bool MemRecorder::record(address p, MEMFLAGS flags, size_t size, jint seq, address pc) {
121 assert(seq > 0, "No sequence number");
120 #ifdef ASSERT 122 #ifdef ASSERT
121 if (MemPointerRecord::is_virtual_memory_record(flags)) { 123 if (MemPointerRecord::is_virtual_memory_record(flags)) {
122 assert((flags & MemPointerRecord::tag_masks) != 0, "bad virtual memory record"); 124 assert((flags & MemPointerRecord::tag_masks) != 0, "bad virtual memory record");
123 } else { 125 } else {
124 assert((flags & MemPointerRecord::tag_masks) == MemPointerRecord::malloc_tag() || 126 assert((flags & MemPointerRecord::tag_masks) == MemPointerRecord::malloc_tag() ||
131 assert(cur_generation == _generation, 133 assert(cur_generation == _generation,
132 "this thread did not enter sync point"); 134 "this thread did not enter sync point");
133 #endif 135 #endif
134 136
135 if (MemTracker::track_callsite()) { 137 if (MemTracker::track_callsite()) {
136 SeqMemPointerRecordEx ap(p, flags, size, pc); 138 SeqMemPointerRecordEx ap(p, flags, size, seq, pc);
137 debug_only(check_dup_seq(ap.seq());) 139 debug_only(check_dup_seq(ap.seq());)
138 return _pointer_records->append(&ap); 140 return _pointer_records->append(&ap);
139 } else { 141 } else {
140 SeqMemPointerRecord ap(p, flags, size); 142 SeqMemPointerRecord ap(p, flags, size, seq);
141 debug_only(check_dup_seq(ap.seq());) 143 debug_only(check_dup_seq(ap.seq());)
142 return _pointer_records->append(&ap); 144 return _pointer_records->append(&ap);
143 } 145 }
144 } 146 }
145 147