src/share/vm/services/memPtrArray.hpp

Fri, 25 Jan 2013 10:04:08 -0500

author
zgu
date
Fri, 25 Jan 2013 10:04:08 -0500
changeset 4492
8b46b0196eb0
parent 4053
33143ee07800
child 6876
710a3c8b516e
permissions
-rw-r--r--

8000692: Remove old KERNEL code
Summary: Removed depreciated kernel VM source code from hotspot VM
Reviewed-by: dholmes, acorn

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

mercurial