src/share/vm/utilities/array.cpp

Thu, 20 Nov 2008 16:56:09 -0800

author
ysr
date
Thu, 20 Nov 2008 16:56:09 -0800
changeset 888
c96030fff130
parent 435
a61af66fc99e
child 1907
c18cbe5936b8
permissions
-rw-r--r--

6684579: SoftReference processing can be made more efficient
Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not.
Reviewed-by: jmasa

duke@435 1 /*
duke@435 2 * Copyright 2000-2004 Sun Microsystems, Inc. All Rights Reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
duke@435 19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@435 20 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@435 21 * have any questions.
duke@435 22 *
duke@435 23 */
duke@435 24
duke@435 25 # include "incls/_precompiled.incl"
duke@435 26 # include "incls/_array.cpp.incl"
duke@435 27
duke@435 28
duke@435 29 #ifdef ASSERT
duke@435 30 void ResourceArray::init_nesting() {
duke@435 31 _nesting = Thread::current()->resource_area()->nesting();
duke@435 32 }
duke@435 33 #endif
duke@435 34
duke@435 35
duke@435 36 void ResourceArray::sort(size_t esize, ftype f) {
duke@435 37 if (!is_empty()) qsort(_data, length(), esize, f);
duke@435 38 }
duke@435 39 void CHeapArray::sort(size_t esize, ftype f) {
duke@435 40 if (!is_empty()) qsort(_data, length(), esize, f);
duke@435 41 }
duke@435 42
duke@435 43
duke@435 44 void ResourceArray::expand(size_t esize, int i, int& size) {
duke@435 45 // make sure we are expanding within the original resource mark
duke@435 46 assert(
duke@435 47 _nesting == Thread::current()->resource_area()->nesting(),
duke@435 48 "allocating outside original resource mark"
duke@435 49 );
duke@435 50 // determine new size
duke@435 51 if (size == 0) size = 4; // prevent endless loop
duke@435 52 while (i >= size) size *= 2;
duke@435 53 // allocate and initialize new data section
duke@435 54 void* data = resource_allocate_bytes(esize * size);
duke@435 55 memcpy(data, _data, esize * length());
duke@435 56 _data = data;
duke@435 57 }
duke@435 58
duke@435 59
duke@435 60 void CHeapArray::expand(size_t esize, int i, int& size) {
duke@435 61 // determine new size
duke@435 62 if (size == 0) size = 4; // prevent endless loop
duke@435 63 while (i >= size) size *= 2;
duke@435 64 // allocate and initialize new data section
duke@435 65 void* data = NEW_C_HEAP_ARRAY(char*, esize * size);
duke@435 66 memcpy(data, _data, esize * length());
duke@435 67 FREE_C_HEAP_ARRAY(char*, _data);
duke@435 68 _data = data;
duke@435 69 }
duke@435 70
duke@435 71
duke@435 72 void ResourceArray::remove_at(size_t esize, int i) {
duke@435 73 assert(0 <= i && i < length(), "index out of bounds");
duke@435 74 _length--;
duke@435 75 void* dst = (char*)_data + i*esize;
duke@435 76 void* src = (char*)dst + esize;
duke@435 77 size_t cnt = (length() - i)*esize;
duke@435 78 memmove(dst, src, cnt);
duke@435 79 }
duke@435 80
duke@435 81 void CHeapArray::remove_at(size_t esize, int i) {
duke@435 82 assert(0 <= i && i < length(), "index out of bounds");
duke@435 83 _length--;
duke@435 84 void* dst = (char*)_data + i*esize;
duke@435 85 void* src = (char*)dst + esize;
duke@435 86 size_t cnt = (length() - i)*esize;
duke@435 87 memmove(dst, src, cnt);
duke@435 88 }

mercurial