annotate src/share/vm/services/memPtrArray.hpp @ 17866:270d7cb38f40

8038934: Remove prefix allocated_ from methods and variables in Metaspace Reviewed-by: jmasa, coleenp
author ehelin
date Mon, 31 Mar 2014 17:09:38 +0200
parents 33143ee07800
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
1 /*
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
4 *
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
7 * published by the Free Software Foundation.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
8 *
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
13 * accompanied this code).
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
14 *
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
18 *
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
21 * questions.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
22 *
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
23 */
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
24 #ifndef SHARE_VM_UTILITIES_MEM_PTR_ARRAY_HPP
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
25 #define SHARE_VM_UTILITIES_MEM_PTR_ARRAY_HPP
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
26
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
27 #include "memory/allocation.hpp"
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
28 #include "services/memPtr.hpp"
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
29
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
30 class MemPtr;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
31 class MemRecorder;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
32 class ArenaInfo;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
33 class MemSnapshot;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
34
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
35 extern "C" {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
36 typedef int (*FN_SORT)(const void *, const void *);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
37 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
38
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
39
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
40 // Memory pointer array interface. This array is used by NMT to hold
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
41 // various memory block information.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
42 // The memory pointer arrays are usually walked with their iterators.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
43
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
44 class MemPointerArray : public CHeapObj<mtNMT> {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
45 public:
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
46 virtual ~MemPointerArray() { }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
47
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
48 // return true if it can not allocate storage for the data
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
49 virtual bool out_of_memory() const = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
50 virtual bool is_empty() const = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
51 virtual bool is_full() = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
52 virtual int length() const = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
53 virtual void clear() = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
54 virtual bool append(MemPointer* ptr) = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
55 virtual bool insert_at(MemPointer* ptr, int pos) = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
56 virtual bool remove_at(int pos) = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
57 virtual MemPointer* at(int index) const = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
58 virtual void sort(FN_SORT fn) = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
59 virtual size_t instance_size() const = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
60 virtual bool shrink() = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
61
6607
e5bf1c79ed5b 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 6197
diff changeset
62 NOT_PRODUCT(virtual int capacity() const = 0;)
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
63 };
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
64
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
65 // Iterator interface
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
66 class MemPointerArrayIterator VALUE_OBJ_CLASS_SPEC {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
67 public:
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
68 // return the pointer at current position
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
69 virtual MemPointer* current() const = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
70 // return the next pointer and advance current position
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
71 virtual MemPointer* next() = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
72 // return next pointer without advancing current position
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
73 virtual MemPointer* peek_next() const = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
74 // return previous pointer without changing current position
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
75 virtual MemPointer* peek_prev() const = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
76 // remove the pointer at current position
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
77 virtual void remove() = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
78 // insert the pointer at current position
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
79 virtual bool insert(MemPointer* ptr) = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
80 // insert specified element after current position and
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
81 // move current position to newly inserted position
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
82 virtual bool insert_after(MemPointer* ptr) = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
83 };
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
84
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
85 // implementation class
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
86 class MemPointerArrayIteratorImpl : public MemPointerArrayIterator {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
87 protected:
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
88 MemPointerArray* _array;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
89 int _pos;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
90
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
91 public:
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
92 MemPointerArrayIteratorImpl(MemPointerArray* arr) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
93 assert(arr != NULL, "Parameter check");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
94 _array = arr;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
95 _pos = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
96 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
97
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
98 virtual MemPointer* current() const {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
99 if (_pos < _array->length()) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
100 return _array->at(_pos);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
101 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
102 return NULL;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
103 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
104
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
105 virtual MemPointer* next() {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
106 if (_pos + 1 < _array->length()) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
107 return _array->at(++_pos);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
108 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
109 _pos = _array->length();
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
110 return NULL;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
111 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
112
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
113 virtual MemPointer* peek_next() const {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
114 if (_pos + 1 < _array->length()) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
115 return _array->at(_pos + 1);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
116 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
117 return NULL;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
118 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
119
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
120 virtual MemPointer* peek_prev() const {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
121 if (_pos > 0) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
122 return _array->at(_pos - 1);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
123 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
124 return NULL;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
125 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
126
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
127 virtual void remove() {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
128 if (_pos < _array->length()) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
129 _array->remove_at(_pos);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
130 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
131 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
132
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
133 virtual bool insert(MemPointer* ptr) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
134 return _array->insert_at(ptr, _pos);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
135 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
136
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
137 virtual bool insert_after(MemPointer* ptr) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
138 if (_array->insert_at(ptr, _pos + 1)) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
139 _pos ++;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
140 return true;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
141 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
142 return false;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
143 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
144 };
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
145
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
146
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
147
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
148 // Memory pointer array implementation.
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
149 // This implementation implements expandable array
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
150 #define DEFAULT_PTR_ARRAY_SIZE 1024
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
151
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
152 template <class E> class MemPointerArrayImpl : public MemPointerArray {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
153 private:
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
154 int _max_size;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
155 int _size;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
156 bool _init_elements;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
157 E* _data;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
158
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
159 public:
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
160 MemPointerArrayImpl(int initial_size = DEFAULT_PTR_ARRAY_SIZE, bool init_elements = true):
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
161 _max_size(initial_size), _size(0), _init_elements(init_elements) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
162 _data = (E*)raw_allocate(sizeof(E), initial_size);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
163 if (_init_elements) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
164 for (int index = 0; index < _max_size; index ++) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
165 ::new ((void*)&_data[index]) E();
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
166 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
167 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
168 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
169
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
170 virtual ~MemPointerArrayImpl() {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
171 if (_data != NULL) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
172 raw_free(_data);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
173 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
174 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
175
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
176 public:
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
177 bool out_of_memory() const {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
178 return (_data == NULL);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
179 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
180
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
181 size_t instance_size() const {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
182 return sizeof(MemPointerArrayImpl<E>) + _max_size * sizeof(E);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
183 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
184
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
185 bool is_empty() const {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
186 assert(_data != NULL, "Just check");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
187 return _size == 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
188 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
189
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
190 bool is_full() {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
191 assert(_data != NULL, "Just check");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
192 if (_size < _max_size) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
193 return false;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
194 } else {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
195 return !expand_array();
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
196 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
197 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
198
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
199 int length() const {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
200 assert(_data != NULL, "Just check");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
201 return _size;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
202 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
203
6607
e5bf1c79ed5b 7191124: Optimized build is broken due to inconsistent use of DEBUG_ONLY and NOT_PRODUCT macros in NMT
zgu
parents: 6197
diff changeset
204 NOT_PRODUCT(int capacity() const { return _max_size; })
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
205
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
206 void clear() {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
207 assert(_data != NULL, "Just check");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
208 _size = 0;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
209 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
210
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
211 bool append(MemPointer* ptr) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
212 assert(_data != NULL, "Just check");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
213 if (is_full()) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
214 return false;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
215 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
216 _data[_size ++] = *(E*)ptr;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
217 return true;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
218 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
219
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
220 bool insert_at(MemPointer* ptr, int pos) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
221 assert(_data != NULL, "Just check");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
222 if (is_full()) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
223 return false;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
224 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
225 for (int index = _size; index > pos; index --) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
226 _data[index] = _data[index - 1];
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
227 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
228 _data[pos] = *(E*)ptr;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
229 _size ++;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
230 return true;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
231 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
232
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
233 bool remove_at(int pos) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
234 assert(_data != NULL, "Just check");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
235 if (_size <= pos && pos >= 0) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
236 return false;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
237 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
238 -- _size;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
239
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
240 for (int index = pos; index < _size; index ++) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
241 _data[index] = _data[index + 1];
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
242 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
243 return true;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
244 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
245
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
246 MemPointer* at(int index) const {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
247 assert(_data != NULL, "Just check");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
248 assert(index >= 0 && index < _size, "illegal index");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
249 return &_data[index];
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
250 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
251
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
252 bool shrink() {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
253 float used = ((float)_size) / ((float)_max_size);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
254 if (used < 0.40) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
255 E* old_ptr = _data;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
256 int new_size = ((_max_size) / (2 * DEFAULT_PTR_ARRAY_SIZE) + 1) * DEFAULT_PTR_ARRAY_SIZE;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
257 _data = (E*)raw_reallocate(_data, sizeof(E), new_size);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
258 if (_data == NULL) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
259 _data = old_ptr;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
260 return false;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
261 } else {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
262 _max_size = new_size;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
263 return true;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
264 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
265 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
266 return false;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
267 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
268
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
269 void sort(FN_SORT fn) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
270 assert(_data != NULL, "Just check");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
271 qsort((void*)_data, _size, sizeof(E), fn);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
272 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
273
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
274 private:
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
275 bool expand_array() {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
276 assert(_data != NULL, "Not yet allocated");
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
277 E* old_ptr = _data;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
278 if ((_data = (E*)raw_reallocate((void*)_data, sizeof(E),
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
279 _max_size + DEFAULT_PTR_ARRAY_SIZE)) == NULL) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
280 _data = old_ptr;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
281 return false;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
282 } else {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
283 _max_size += DEFAULT_PTR_ARRAY_SIZE;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
284 if (_init_elements) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
285 for (int index = _size; index < _max_size; index ++) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
286 ::new ((void*)&_data[index]) E();
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
287 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
288 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
289 return true;
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
290 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
291 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
292
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
293 void* raw_allocate(size_t elementSize, int items) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
294 return os::malloc(elementSize * items, mtNMT);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
295 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
296
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
297 void* raw_reallocate(void* ptr, size_t elementSize, int items) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
298 return os::realloc(ptr, elementSize * items, mtNMT);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
299 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
300
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
301 void raw_free(void* ptr) {
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
302 os::free(ptr, mtNMT);
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
303 }
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
304 };
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
305
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents:
diff changeset
306 #endif // SHARE_VM_UTILITIES_MEM_PTR_ARRAY_HPP