src/share/vm/services/memPtrArray.hpp

Tue, 24 Jul 2012 10:51:00 -0700

author
twisti
date
Tue, 24 Jul 2012 10:51:00 -0700
changeset 3969
1d7922586cf6
parent 3900
d2a62e0f25eb
child 3994
e5bf1c79ed5b
permissions
-rw-r--r--

7023639: JSR 292 method handle invocation needs a fast path for compiled code
6984705: JSR 292 method handle creation should not go through JNI
Summary: remove assembly code for JDK 7 chained method handles
Reviewed-by: jrose, twisti, kvn, mhaupt
Contributed-by: John Rose <john.r.rose@oracle.com>, Christian Thalinger <christian.thalinger@oracle.com>, Michael Haupt <michael.haupt@oracle.com>

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@3900 62 debug_only(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 #ifdef ASSERT
zgu@3900 88 protected:
zgu@3900 89 #else
zgu@3900 90 private:
zgu@3900 91 #endif
zgu@3900 92 MemPointerArray* _array;
zgu@3900 93 int _pos;
zgu@3900 94
zgu@3900 95 public:
zgu@3900 96 MemPointerArrayIteratorImpl(MemPointerArray* arr) {
zgu@3900 97 assert(arr != NULL, "Parameter check");
zgu@3900 98 _array = arr;
zgu@3900 99 _pos = 0;
zgu@3900 100 }
zgu@3900 101
zgu@3900 102 virtual MemPointer* current() const {
zgu@3900 103 if (_pos < _array->length()) {
zgu@3900 104 return _array->at(_pos);
zgu@3900 105 }
zgu@3900 106 return NULL;
zgu@3900 107 }
zgu@3900 108
zgu@3900 109 virtual MemPointer* next() {
zgu@3900 110 if (_pos + 1 < _array->length()) {
zgu@3900 111 return _array->at(++_pos);
zgu@3900 112 }
zgu@3900 113 _pos = _array->length();
zgu@3900 114 return NULL;
zgu@3900 115 }
zgu@3900 116
zgu@3900 117 virtual MemPointer* peek_next() const {
zgu@3900 118 if (_pos + 1 < _array->length()) {
zgu@3900 119 return _array->at(_pos + 1);
zgu@3900 120 }
zgu@3900 121 return NULL;
zgu@3900 122 }
zgu@3900 123
zgu@3900 124 virtual MemPointer* peek_prev() const {
zgu@3900 125 if (_pos > 0) {
zgu@3900 126 return _array->at(_pos - 1);
zgu@3900 127 }
zgu@3900 128 return NULL;
zgu@3900 129 }
zgu@3900 130
zgu@3900 131 virtual void remove() {
zgu@3900 132 if (_pos < _array->length()) {
zgu@3900 133 _array->remove_at(_pos);
zgu@3900 134 }
zgu@3900 135 }
zgu@3900 136
zgu@3900 137 virtual bool insert(MemPointer* ptr) {
zgu@3900 138 return _array->insert_at(ptr, _pos);
zgu@3900 139 }
zgu@3900 140
zgu@3900 141 virtual bool insert_after(MemPointer* ptr) {
zgu@3900 142 if (_array->insert_at(ptr, _pos + 1)) {
zgu@3900 143 _pos ++;
zgu@3900 144 return true;
zgu@3900 145 }
zgu@3900 146 return false;
zgu@3900 147 }
zgu@3900 148 };
zgu@3900 149
zgu@3900 150
zgu@3900 151
zgu@3900 152 // Memory pointer array implementation.
zgu@3900 153 // This implementation implements expandable array
zgu@3900 154 #define DEFAULT_PTR_ARRAY_SIZE 1024
zgu@3900 155
zgu@3900 156 template <class E> class MemPointerArrayImpl : public MemPointerArray {
zgu@3900 157 private:
zgu@3900 158 int _max_size;
zgu@3900 159 int _size;
zgu@3900 160 bool _init_elements;
zgu@3900 161 E* _data;
zgu@3900 162
zgu@3900 163 public:
zgu@3900 164 MemPointerArrayImpl(int initial_size = DEFAULT_PTR_ARRAY_SIZE, bool init_elements = true):
zgu@3900 165 _max_size(initial_size), _size(0), _init_elements(init_elements) {
zgu@3900 166 _data = (E*)raw_allocate(sizeof(E), initial_size);
zgu@3900 167 if (_init_elements) {
zgu@3900 168 for (int index = 0; index < _max_size; index ++) {
zgu@3900 169 ::new ((void*)&_data[index]) E();
zgu@3900 170 }
zgu@3900 171 }
zgu@3900 172 }
zgu@3900 173
zgu@3900 174 virtual ~MemPointerArrayImpl() {
zgu@3900 175 if (_data != NULL) {
zgu@3900 176 raw_free(_data);
zgu@3900 177 }
zgu@3900 178 }
zgu@3900 179
zgu@3900 180 public:
zgu@3900 181 bool out_of_memory() const {
zgu@3900 182 return (_data == NULL);
zgu@3900 183 }
zgu@3900 184
zgu@3900 185 size_t instance_size() const {
zgu@3900 186 return sizeof(MemPointerArrayImpl<E>) + _max_size * sizeof(E);
zgu@3900 187 }
zgu@3900 188
zgu@3900 189 bool is_empty() const {
zgu@3900 190 assert(_data != NULL, "Just check");
zgu@3900 191 return _size == 0;
zgu@3900 192 }
zgu@3900 193
zgu@3900 194 bool is_full() {
zgu@3900 195 assert(_data != NULL, "Just check");
zgu@3900 196 if (_size < _max_size) {
zgu@3900 197 return false;
zgu@3900 198 } else {
zgu@3900 199 return !expand_array();
zgu@3900 200 }
zgu@3900 201 }
zgu@3900 202
zgu@3900 203 int length() const {
zgu@3900 204 assert(_data != NULL, "Just check");
zgu@3900 205 return _size;
zgu@3900 206 }
zgu@3900 207
zgu@3900 208 debug_only(int capacity() const { return _max_size; })
zgu@3900 209
zgu@3900 210 void clear() {
zgu@3900 211 assert(_data != NULL, "Just check");
zgu@3900 212 _size = 0;
zgu@3900 213 }
zgu@3900 214
zgu@3900 215 bool append(MemPointer* ptr) {
zgu@3900 216 assert(_data != NULL, "Just check");
zgu@3900 217 if (is_full()) {
zgu@3900 218 return false;
zgu@3900 219 }
zgu@3900 220 _data[_size ++] = *(E*)ptr;
zgu@3900 221 return true;
zgu@3900 222 }
zgu@3900 223
zgu@3900 224 bool insert_at(MemPointer* ptr, int pos) {
zgu@3900 225 assert(_data != NULL, "Just check");
zgu@3900 226 if (is_full()) {
zgu@3900 227 return false;
zgu@3900 228 }
zgu@3900 229 for (int index = _size; index > pos; index --) {
zgu@3900 230 _data[index] = _data[index - 1];
zgu@3900 231 }
zgu@3900 232 _data[pos] = *(E*)ptr;
zgu@3900 233 _size ++;
zgu@3900 234 return true;
zgu@3900 235 }
zgu@3900 236
zgu@3900 237 bool remove_at(int pos) {
zgu@3900 238 assert(_data != NULL, "Just check");
zgu@3900 239 if (_size <= pos && pos >= 0) {
zgu@3900 240 return false;
zgu@3900 241 }
zgu@3900 242 -- _size;
zgu@3900 243
zgu@3900 244 for (int index = pos; index < _size; index ++) {
zgu@3900 245 _data[index] = _data[index + 1];
zgu@3900 246 }
zgu@3900 247 return true;
zgu@3900 248 }
zgu@3900 249
zgu@3900 250 MemPointer* at(int index) const {
zgu@3900 251 assert(_data != NULL, "Just check");
zgu@3900 252 assert(index >= 0 && index < _size, "illegal index");
zgu@3900 253 return &_data[index];
zgu@3900 254 }
zgu@3900 255
zgu@3900 256 bool shrink() {
zgu@3900 257 float used = ((float)_size) / ((float)_max_size);
zgu@3900 258 if (used < 0.40) {
zgu@3900 259 E* old_ptr = _data;
zgu@3900 260 int new_size = ((_max_size) / (2 * DEFAULT_PTR_ARRAY_SIZE) + 1) * DEFAULT_PTR_ARRAY_SIZE;
zgu@3900 261 _data = (E*)raw_reallocate(_data, sizeof(E), new_size);
zgu@3900 262 if (_data == NULL) {
zgu@3900 263 _data = old_ptr;
zgu@3900 264 return false;
zgu@3900 265 } else {
zgu@3900 266 _max_size = new_size;
zgu@3900 267 return true;
zgu@3900 268 }
zgu@3900 269 }
zgu@3900 270 return false;
zgu@3900 271 }
zgu@3900 272
zgu@3900 273 void sort(FN_SORT fn) {
zgu@3900 274 assert(_data != NULL, "Just check");
zgu@3900 275 qsort((void*)_data, _size, sizeof(E), fn);
zgu@3900 276 }
zgu@3900 277
zgu@3900 278 private:
zgu@3900 279 bool expand_array() {
zgu@3900 280 assert(_data != NULL, "Not yet allocated");
zgu@3900 281 E* old_ptr = _data;
zgu@3900 282 if ((_data = (E*)raw_reallocate((void*)_data, sizeof(E),
zgu@3900 283 _max_size + DEFAULT_PTR_ARRAY_SIZE)) == NULL) {
zgu@3900 284 _data = old_ptr;
zgu@3900 285 return false;
zgu@3900 286 } else {
zgu@3900 287 _max_size += DEFAULT_PTR_ARRAY_SIZE;
zgu@3900 288 if (_init_elements) {
zgu@3900 289 for (int index = _size; index < _max_size; index ++) {
zgu@3900 290 ::new ((void*)&_data[index]) E();
zgu@3900 291 }
zgu@3900 292 }
zgu@3900 293 return true;
zgu@3900 294 }
zgu@3900 295 }
zgu@3900 296
zgu@3900 297 void* raw_allocate(size_t elementSize, int items) {
zgu@3900 298 return os::malloc(elementSize * items, mtNMT);
zgu@3900 299 }
zgu@3900 300
zgu@3900 301 void* raw_reallocate(void* ptr, size_t elementSize, int items) {
zgu@3900 302 return os::realloc(ptr, elementSize * items, mtNMT);
zgu@3900 303 }
zgu@3900 304
zgu@3900 305 void raw_free(void* ptr) {
zgu@3900 306 os::free(ptr, mtNMT);
zgu@3900 307 }
zgu@3900 308 };
zgu@3900 309
zgu@3900 310 #endif // SHARE_VM_UTILITIES_MEM_PTR_ARRAY_HPP

mercurial