Mercurial > hg > graal-compiler
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 |