equal
deleted
inserted
replaced
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 |