annotate src/share/vm/memory/binaryTreeDictionary.cpp @ 10241:d17700c82d7d

8006088: Incompatible heap size flags accepted by VM Summary: Make processing of minimum, initial and maximum heap size more intiutive by removing previous limitations on allowed values, and make error reporting consistent. Further, fix errors in ergonomic heap sizing. Reviewed-by: johnc, jwilhelm, tamao
author tschatzl
date Mon, 06 May 2013 17:19:42 +0200
parents 3c9bc17b9403
children de88570fabfc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
2 * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1489
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1489
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1489
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1777
diff changeset
25 #include "precompiled.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
26 #include "utilities/macros.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1777
diff changeset
27 #include "gc_implementation/shared/allocationStats.hpp"
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
28 #include "memory/binaryTreeDictionary.hpp"
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
29 #include "memory/freeList.hpp"
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
30 #include "memory/freeBlockDictionary.hpp"
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
31 #include "memory/metablock.hpp"
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
32 #include "memory/metachunk.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1777
diff changeset
33 #include "runtime/globals.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1777
diff changeset
34 #include "utilities/ostream.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
35 #include "utilities/macros.hpp"
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
36 #if INCLUDE_ALL_GCS
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
37 #include "gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp"
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
38 #include "gc_implementation/concurrentMarkSweep/freeChunk.hpp"
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
39 #include "gc_implementation/shared/spaceDecorator.hpp"
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
40 #include "gc_implementation/concurrentMarkSweep/freeChunk.hpp"
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
41 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
42
a61af66fc99e Initial load
duke
parents:
diff changeset
43 ////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // A binary tree based search structure for free blocks.
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // This is currently used in the Concurrent Mark&Sweep implementation.
a61af66fc99e Initial load
duke
parents:
diff changeset
46 ////////////////////////////////////////////////////////////////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
47
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
48 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
49 size_t TreeChunk<Chunk_t, FreeList_t>::_min_tree_chunk_size = sizeof(TreeChunk<Chunk_t, FreeList_t>)/HeapWordSize;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
50
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
51 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
52 TreeChunk<Chunk_t, FreeList_t>* TreeChunk<Chunk_t, FreeList_t>::as_TreeChunk(Chunk_t* fc) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // Do some assertion checking here.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
54 return (TreeChunk<Chunk_t, FreeList_t>*) fc;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
55 }
a61af66fc99e Initial load
duke
parents:
diff changeset
56
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
57 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
58 void TreeChunk<Chunk_t, FreeList_t>::verify_tree_chunk_list() const {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
59 TreeChunk<Chunk_t, FreeList_t>* nextTC = (TreeChunk<Chunk_t, FreeList_t>*)next();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
60 if (prev() != NULL) { // interior list node shouldn'r have tree fields
a61af66fc99e Initial load
duke
parents:
diff changeset
61 guarantee(embedded_list()->parent() == NULL && embedded_list()->left() == NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
62 embedded_list()->right() == NULL, "should be clear");
a61af66fc99e Initial load
duke
parents:
diff changeset
63 }
a61af66fc99e Initial load
duke
parents:
diff changeset
64 if (nextTC != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
65 guarantee(as_TreeChunk(nextTC->prev()) == this, "broken chain");
a61af66fc99e Initial load
duke
parents:
diff changeset
66 guarantee(nextTC->size() == size(), "wrong size");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
67 nextTC->verify_tree_chunk_list();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
68 }
a61af66fc99e Initial load
duke
parents:
diff changeset
69 }
a61af66fc99e Initial load
duke
parents:
diff changeset
70
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
71 template <class Chunk_t, template <class> class FreeList_t>
7446
e51c9860cf66 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 7178
diff changeset
72 TreeList<Chunk_t, FreeList_t>::TreeList() : _parent(NULL),
e51c9860cf66 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 7178
diff changeset
73 _left(NULL), _right(NULL) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
74
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
75 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
76 TreeList<Chunk_t, FreeList_t>*
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
77 TreeList<Chunk_t, FreeList_t>::as_TreeList(TreeChunk<Chunk_t,FreeList_t>* tc) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // This first free chunk in the list will be the tree list.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
79 assert((tc->size() >= (TreeChunk<Chunk_t, FreeList_t>::min_size())),
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
80 "Chunk is too small for a TreeChunk");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
81 TreeList<Chunk_t, FreeList_t>* tl = tc->embedded_list();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
82 tl->initialize();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 tc->set_list(tl);
a61af66fc99e Initial load
duke
parents:
diff changeset
84 tl->set_size(tc->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
85 tl->link_head(tc);
a61af66fc99e Initial load
duke
parents:
diff changeset
86 tl->link_tail(tc);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 tl->set_count(1);
7446
e51c9860cf66 8005082: NPG: Add specialized Metachunk sizes for reflection and anonymous classloaders
jmasa
parents: 7178
diff changeset
88 assert(tl->parent() == NULL, "Should be clear");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
89 return tl;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
90 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
91
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
92
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
93 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
94 TreeList<Chunk_t, FreeList_t>*
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
95 get_chunk(size_t size, enum FreeBlockDictionary<Chunk_t>::Dither dither) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
96 FreeBlockDictionary<Chunk_t>::verify_par_locked();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
97 Chunk_t* res = get_chunk_from_tree(size, dither);
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
98 assert(res == NULL || res->is_free(),
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
99 "Should be returning a free chunk");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
100 assert(dither != FreeBlockDictionary<Chunk_t>::exactly ||
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
101 res->size() == size, "Not correct size");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
102 return res;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
103 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
104
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
105 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
106 TreeList<Chunk_t, FreeList_t>*
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
107 TreeList<Chunk_t, FreeList_t>::as_TreeList(HeapWord* addr, size_t size) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
108 TreeChunk<Chunk_t, FreeList_t>* tc = (TreeChunk<Chunk_t, FreeList_t>*) addr;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
109 assert((size >= TreeChunk<Chunk_t, FreeList_t>::min_size()),
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
110 "Chunk is too small for a TreeChunk");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
111 // The space will have been mangled initially but
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
112 // is not remangled when a Chunk_t is returned to the free list
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
113 // (since it is used to maintain the chunk on the free list).
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
114 tc->assert_is_mangled();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
115 tc->set_size(size);
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
116 tc->link_prev(NULL);
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
117 tc->link_next(NULL);
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
118 TreeList<Chunk_t, FreeList_t>* tl = TreeList<Chunk_t, FreeList_t>::as_TreeList(tc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
119 return tl;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
121
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
122
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
123 #if INCLUDE_ALL_GCS
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
124 // Specialize for AdaptiveFreeList which tries to avoid
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
125 // splitting a chunk of a size that is under populated in favor of
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
126 // an over populated size. The general get_better_list() just returns
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
127 // the current list.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
128 template <>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
129 TreeList<FreeChunk, AdaptiveFreeList>*
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
130 TreeList<FreeChunk, AdaptiveFreeList>::get_better_list(
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
131 BinaryTreeDictionary<FreeChunk, ::AdaptiveFreeList>* dictionary) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
132 // A candidate chunk has been found. If it is already under
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
133 // populated, get a chunk associated with the hint for this
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
134 // chunk.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
135
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
136 TreeList<FreeChunk, ::AdaptiveFreeList>* curTL = this;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
137 if (surplus() <= 0) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
138 /* Use the hint to find a size with a surplus, and reset the hint. */
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
139 TreeList<FreeChunk, ::AdaptiveFreeList>* hintTL = this;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
140 while (hintTL->hint() != 0) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
141 assert(hintTL->hint() > hintTL->size(),
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
142 "hint points in the wrong direction");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
143 hintTL = dictionary->find_list(hintTL->hint());
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
144 assert(curTL != hintTL, "Infinite loop");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
145 if (hintTL == NULL ||
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
146 hintTL == curTL /* Should not happen but protect against it */ ) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
147 // No useful hint. Set the hint to NULL and go on.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
148 curTL->set_hint(0);
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
149 break;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
150 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
151 assert(hintTL->size() > curTL->size(), "hint is inconsistent");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
152 if (hintTL->surplus() > 0) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
153 // The hint led to a list that has a surplus. Use it.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
154 // Set the hint for the candidate to an overpopulated
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
155 // size.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
156 curTL->set_hint(hintTL->size());
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
157 // Change the candidate.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
158 curTL = hintTL;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
159 break;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
160 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
161 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
162 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
163 return curTL;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
164 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
165 #endif // INCLUDE_ALL_GCS
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
166
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
167 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
168 TreeList<Chunk_t, FreeList_t>*
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
169 TreeList<Chunk_t, FreeList_t>::get_better_list(
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
170 BinaryTreeDictionary<Chunk_t, FreeList_t>* dictionary) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
171 return this;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
174 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
175 TreeList<Chunk_t, FreeList_t>* TreeList<Chunk_t, FreeList_t>::remove_chunk_replace_if_needed(TreeChunk<Chunk_t, FreeList_t>* tc) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
176
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
177 TreeList<Chunk_t, FreeList_t>* retTL = this;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
178 Chunk_t* list = head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
179 assert(!list || list != list->next(), "Chunk on list twice");
a61af66fc99e Initial load
duke
parents:
diff changeset
180 assert(tc != NULL, "Chunk being removed is NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
181 assert(parent() == NULL || this == parent()->left() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
182 this == parent()->right(), "list is inconsistent");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
183 assert(tc->is_free(), "Header is not marked correctly");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
184 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
185 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
186
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
187 Chunk_t* prevFC = tc->prev();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
188 TreeChunk<Chunk_t, FreeList_t>* nextTC = TreeChunk<Chunk_t, FreeList_t>::as_TreeChunk(tc->next());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
189 assert(list != NULL, "should have at least the target chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // Is this the first item on the list?
a61af66fc99e Initial load
duke
parents:
diff changeset
192 if (tc == list) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
193 // The "getChunk..." functions for a TreeList<Chunk_t, FreeList_t> will not return the
0
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // first chunk in the list unless it is the last chunk in the list
a61af66fc99e Initial load
duke
parents:
diff changeset
195 // because the first chunk is also acting as the tree node.
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // When coalescing happens, however, the first chunk in the a tree
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // list can be the start of a free range. Free ranges are removed
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // from the free lists so that they are not available to be
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // allocated when the sweeper yields (giving up the free list lock)
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // to allow mutator activity. If this chunk is the first in the
a61af66fc99e Initial load
duke
parents:
diff changeset
201 // list and is not the last in the list, do the work to copy the
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
202 // TreeList<Chunk_t, FreeList_t> from the first chunk to the next chunk and update all
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
203 // the TreeList<Chunk_t, FreeList_t> pointers in the chunks in the list.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
204 if (nextTC == NULL) {
1489
cff162798819 6888953: some calls to function-like macros are missing semicolons
jcoomes
parents: 1145
diff changeset
205 assert(prevFC == NULL, "Not last chunk in the list");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
206 set_tail(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
207 set_head(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // copy embedded list.
a61af66fc99e Initial load
duke
parents:
diff changeset
210 nextTC->set_embedded_list(tc->embedded_list());
a61af66fc99e Initial load
duke
parents:
diff changeset
211 retTL = nextTC->embedded_list();
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // Fix the pointer to the list in each chunk in the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // This can be slow for a long list. Consider having
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // an option that does not allow the first chunk on the
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // list to be coalesced.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
216 for (TreeChunk<Chunk_t, FreeList_t>* curTC = nextTC; curTC != NULL;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
217 curTC = TreeChunk<Chunk_t, FreeList_t>::as_TreeChunk(curTC->next())) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
218 curTC->set_list(retTL);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
220 // Fix the parent to point to the new TreeList<Chunk_t, FreeList_t>.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
221 if (retTL->parent() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 if (this == retTL->parent()->left()) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
223 retTL->parent()->set_left(retTL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
224 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
225 assert(this == retTL->parent()->right(), "Parent is incorrect");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
226 retTL->parent()->set_right(retTL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Fix the children's parent pointers to point to the
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // new list.
a61af66fc99e Initial load
duke
parents:
diff changeset
231 assert(right() == retTL->right(), "Should have been copied");
a61af66fc99e Initial load
duke
parents:
diff changeset
232 if (retTL->right() != NULL) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
233 retTL->right()->set_parent(retTL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
235 assert(left() == retTL->left(), "Should have been copied");
a61af66fc99e Initial load
duke
parents:
diff changeset
236 if (retTL->left() != NULL) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
237 retTL->left()->set_parent(retTL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239 retTL->link_head(nextTC);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
240 assert(nextTC->is_free(), "Should be a free chunk");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
243 if (nextTC == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // Removing chunk at tail of list
6970
0400886d2613 8003259: NPG: Build with gcc 4.7.2 broken by 7045397
coleenp
parents: 6885
diff changeset
245 this->link_tail(prevFC);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246 }
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // Chunk is interior to the list
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
248 prevFC->link_after(nextTC);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
251 // Below this point the embeded TreeList<Chunk_t, FreeList_t> being used for the
0
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // tree node may have changed. Don't use "this"
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
253 // TreeList<Chunk_t, FreeList_t>*.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
254 // chunk should still be a free chunk (bit set in _prev)
a61af66fc99e Initial load
duke
parents:
diff changeset
255 assert(!retTL->head() || retTL->size() == retTL->head()->size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
256 "Wrong sized chunk in list");
a61af66fc99e Initial load
duke
parents:
diff changeset
257 debug_only(
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
258 tc->link_prev(NULL);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
259 tc->link_next(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
260 tc->set_list(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
261 bool prev_found = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 bool next_found = false;
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
263 for (Chunk_t* curFC = retTL->head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
264 curFC != NULL; curFC = curFC->next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 assert(curFC != tc, "Chunk is still in list");
a61af66fc99e Initial load
duke
parents:
diff changeset
266 if (curFC == prevFC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 prev_found = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269 if (curFC == nextTC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 next_found = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273 assert(prevFC == NULL || prev_found, "Chunk was lost from list");
a61af66fc99e Initial load
duke
parents:
diff changeset
274 assert(nextTC == NULL || next_found, "Chunk was lost from list");
a61af66fc99e Initial load
duke
parents:
diff changeset
275 assert(retTL->parent() == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
276 retTL == retTL->parent()->left() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
277 retTL == retTL->parent()->right(),
a61af66fc99e Initial load
duke
parents:
diff changeset
278 "list is inconsistent");
a61af66fc99e Initial load
duke
parents:
diff changeset
279 )
a61af66fc99e Initial load
duke
parents:
diff changeset
280 retTL->decrement_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
281
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
282 assert(tc->is_free(), "Should still be a free chunk");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283 assert(retTL->head() == NULL || retTL->head()->prev() == NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
284 "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
285 assert(retTL->tail() == NULL || retTL->tail()->next() == NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
286 "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
287 return retTL;
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
289
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
290 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
291 void TreeList<Chunk_t, FreeList_t>::return_chunk_at_tail(TreeChunk<Chunk_t, FreeList_t>* chunk) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
292 assert(chunk != NULL, "returning NULL chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
293 assert(chunk->list() == this, "list should be set for chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
294 assert(tail() != NULL, "The tree list is embedded in the first chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // which means that the list can never be empty.
7178
19c1bd641922 8003722: More gcc 4.7 compilation errors
coleenp
parents: 6970
diff changeset
296 assert(!this->verify_chunk_in_free_list(chunk), "Double entry");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
297 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
298 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
299
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
300 Chunk_t* fc = tail();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
301 fc->link_after(chunk);
6970
0400886d2613 8003259: NPG: Build with gcc 4.7.2 broken by 7045397
coleenp
parents: 6885
diff changeset
302 this->link_tail(chunk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304 assert(!tail() || size() == tail()->size(), "Wrong sized chunk in list");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
305 FreeList_t<Chunk_t>::increment_count();
7178
19c1bd641922 8003722: More gcc 4.7 compilation errors
coleenp
parents: 6970
diff changeset
306 debug_only(this->increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
307 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
308 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // Add this chunk at the head of the list. "At the head of the list"
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // is defined to be after the chunk pointer to by head(). This is
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
313 // because the TreeList<Chunk_t, FreeList_t> is embedded in the first TreeChunk<Chunk_t, FreeList_t> in the
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
314 // list. See the definition of TreeChunk<Chunk_t, FreeList_t>.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
315 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
316 void TreeList<Chunk_t, FreeList_t>::return_chunk_at_head(TreeChunk<Chunk_t, FreeList_t>* chunk) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
317 assert(chunk->list() == this, "list should be set for chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
318 assert(head() != NULL, "The tree list is embedded in the first chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
319 assert(chunk != NULL, "returning NULL chunk");
7178
19c1bd641922 8003722: More gcc 4.7 compilation errors
coleenp
parents: 6970
diff changeset
320 assert(!this->verify_chunk_in_free_list(chunk), "Double entry");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
321 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
322 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
323
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
324 Chunk_t* fc = head()->next();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
325 if (fc != NULL) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
326 chunk->link_after(fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
327 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 assert(tail() == NULL, "List is inconsistent");
6970
0400886d2613 8003259: NPG: Build with gcc 4.7.2 broken by 7045397
coleenp
parents: 6885
diff changeset
329 this->link_tail(chunk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
331 head()->link_after(chunk);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
332 assert(!head() || size() == head()->size(), "Wrong sized chunk in list");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
333 FreeList_t<Chunk_t>::increment_count();
7178
19c1bd641922 8003722: More gcc 4.7 compilation errors
coleenp
parents: 6970
diff changeset
334 debug_only(this->increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
335 assert(head() == NULL || head()->prev() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
336 assert(tail() == NULL || tail()->next() == NULL, "list invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
339 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
340 void TreeChunk<Chunk_t, FreeList_t>::assert_is_mangled() const {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
341 assert((ZapUnusedHeapArea &&
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
342 SpaceMangler::is_mangled((HeapWord*) Chunk_t::size_addr()) &&
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
343 SpaceMangler::is_mangled((HeapWord*) Chunk_t::prev_addr()) &&
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
344 SpaceMangler::is_mangled((HeapWord*) Chunk_t::next_addr())) ||
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
345 (size() == 0 && prev() == NULL && next() == NULL),
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
346 "Space should be clear or mangled");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
348
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
349 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
350 TreeChunk<Chunk_t, FreeList_t>* TreeList<Chunk_t, FreeList_t>::head_as_TreeChunk() {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
351 assert(head() == NULL || (TreeChunk<Chunk_t, FreeList_t>::as_TreeChunk(head())->list() == this),
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
352 "Wrong type of chunk?");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
353 return TreeChunk<Chunk_t, FreeList_t>::as_TreeChunk(head());
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
354 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
355
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
356 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
357 TreeChunk<Chunk_t, FreeList_t>* TreeList<Chunk_t, FreeList_t>::first_available() {
1777
179464550c7d 6983930: CMS: Various small cleanups ca September 2010
ysr
parents: 1552
diff changeset
358 assert(head() != NULL, "The head of the list cannot be NULL");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
359 Chunk_t* fc = head()->next();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
360 TreeChunk<Chunk_t, FreeList_t>* retTC;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
361 if (fc == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
362 retTC = head_as_TreeChunk();
a61af66fc99e Initial load
duke
parents:
diff changeset
363 } else {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
364 retTC = TreeChunk<Chunk_t, FreeList_t>::as_TreeChunk(fc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
365 }
a61af66fc99e Initial load
duke
parents:
diff changeset
366 assert(retTC->list() == this, "Wrong type of chunk.");
a61af66fc99e Initial load
duke
parents:
diff changeset
367 return retTC;
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
370 // Returns the block with the largest heap address amongst
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
371 // those in the list for this size; potentially slow and expensive,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
372 // use with caution!
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
373 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
374 TreeChunk<Chunk_t, FreeList_t>* TreeList<Chunk_t, FreeList_t>::largest_address() {
1777
179464550c7d 6983930: CMS: Various small cleanups ca September 2010
ysr
parents: 1552
diff changeset
375 assert(head() != NULL, "The head of the list cannot be NULL");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
376 Chunk_t* fc = head()->next();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
377 TreeChunk<Chunk_t, FreeList_t>* retTC;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
378 if (fc == NULL) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
379 retTC = head_as_TreeChunk();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
380 } else {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
381 // walk down the list and return the one with the highest
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
382 // heap address among chunks of this size.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
383 Chunk_t* last = fc;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
384 while (fc->next() != NULL) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
385 if ((HeapWord*)last < (HeapWord*)fc) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
386 last = fc;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
387 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
388 fc = fc->next();
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
389 }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
390 retTC = TreeChunk<Chunk_t, FreeList_t>::as_TreeChunk(last);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
391 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
392 assert(retTC->list() == this, "Wrong type of chunk.");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
393 return retTC;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
394 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
395
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
396 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
397 BinaryTreeDictionary<Chunk_t, FreeList_t>::BinaryTreeDictionary(MemRegion mr) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
398 assert((mr.byte_size() > min_size()), "minimum chunk size");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 reset(mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
401 assert(root()->left() == NULL, "reset check failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
402 assert(root()->right() == NULL, "reset check failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
403 assert(root()->head()->next() == NULL, "reset check failed");
a61af66fc99e Initial load
duke
parents:
diff changeset
404 assert(root()->head()->prev() == NULL, "reset check failed");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
405 assert(total_size() == root()->size(), "reset check failed");
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
406 assert(total_free_blocks() == 1, "reset check failed");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
408
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
409 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
410 void BinaryTreeDictionary<Chunk_t, FreeList_t>::inc_total_size(size_t inc) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
411 _total_size = _total_size + inc;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
413
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
414 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
415 void BinaryTreeDictionary<Chunk_t, FreeList_t>::dec_total_size(size_t dec) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
416 _total_size = _total_size - dec;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
417 }
a61af66fc99e Initial load
duke
parents:
diff changeset
418
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
419 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
420 void BinaryTreeDictionary<Chunk_t, FreeList_t>::reset(MemRegion mr) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
421 assert((mr.byte_size() > min_size()), "minimum chunk size");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
422 set_root(TreeList<Chunk_t, FreeList_t>::as_TreeList(mr.start(), mr.word_size()));
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
423 set_total_size(mr.word_size());
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
424 set_total_free_blocks(1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
425 }
a61af66fc99e Initial load
duke
parents:
diff changeset
426
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
427 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
428 void BinaryTreeDictionary<Chunk_t, FreeList_t>::reset(HeapWord* addr, size_t byte_size) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
429 MemRegion mr(addr, heap_word_size(byte_size));
a61af66fc99e Initial load
duke
parents:
diff changeset
430 reset(mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
431 }
a61af66fc99e Initial load
duke
parents:
diff changeset
432
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
433 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
434 void BinaryTreeDictionary<Chunk_t, FreeList_t>::reset() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
435 set_root(NULL);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
436 set_total_size(0);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
437 set_total_free_blocks(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439
a61af66fc99e Initial load
duke
parents:
diff changeset
440 // Get a free block of size at least size from tree, or NULL.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
441 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
442 TreeChunk<Chunk_t, FreeList_t>*
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
443 BinaryTreeDictionary<Chunk_t, FreeList_t>::get_chunk_from_tree(
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
444 size_t size,
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
445 enum FreeBlockDictionary<Chunk_t>::Dither dither)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
446 {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
447 TreeList<Chunk_t, FreeList_t> *curTL, *prevTL;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
448 TreeChunk<Chunk_t, FreeList_t>* retTC = NULL;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
449
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
450 assert((size >= min_size()), "minimum chunk size");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
451 if (FLSVerifyDictionary) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
452 verify_tree();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // starting at the root, work downwards trying to find match.
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Remember the last node of size too great or too small.
a61af66fc99e Initial load
duke
parents:
diff changeset
456 for (prevTL = curTL = root(); curTL != NULL;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
457 if (curTL->size() == size) { // exact match
a61af66fc99e Initial load
duke
parents:
diff changeset
458 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
460 prevTL = curTL;
a61af66fc99e Initial load
duke
parents:
diff changeset
461 if (curTL->size() < size) { // proceed to right sub-tree
a61af66fc99e Initial load
duke
parents:
diff changeset
462 curTL = curTL->right();
a61af66fc99e Initial load
duke
parents:
diff changeset
463 } else { // proceed to left sub-tree
a61af66fc99e Initial load
duke
parents:
diff changeset
464 assert(curTL->size() > size, "size inconsistency");
a61af66fc99e Initial load
duke
parents:
diff changeset
465 curTL = curTL->left();
a61af66fc99e Initial load
duke
parents:
diff changeset
466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
467 }
a61af66fc99e Initial load
duke
parents:
diff changeset
468 if (curTL == NULL) { // couldn't find exact match
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
469
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
470 if (dither == FreeBlockDictionary<Chunk_t>::exactly) return NULL;
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
471
0
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // try and find the next larger size by walking back up the search path
a61af66fc99e Initial load
duke
parents:
diff changeset
473 for (curTL = prevTL; curTL != NULL;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 if (curTL->size() >= size) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 else curTL = curTL->parent();
a61af66fc99e Initial load
duke
parents:
diff changeset
476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
477 assert(curTL == NULL || curTL->count() > 0,
a61af66fc99e Initial load
duke
parents:
diff changeset
478 "An empty list should not be in the tree");
a61af66fc99e Initial load
duke
parents:
diff changeset
479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
480 if (curTL != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 assert(curTL->size() >= size, "size inconsistency");
a61af66fc99e Initial load
duke
parents:
diff changeset
482
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
483 curTL = curTL->get_better_list(this);
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
484
0
a61af66fc99e Initial load
duke
parents:
diff changeset
485 retTC = curTL->first_available();
a61af66fc99e Initial load
duke
parents:
diff changeset
486 assert((retTC != NULL) && (curTL->count() > 0),
a61af66fc99e Initial load
duke
parents:
diff changeset
487 "A list in the binary tree should not be NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
488 assert(retTC->size() >= size,
a61af66fc99e Initial load
duke
parents:
diff changeset
489 "A chunk of the wrong size was found");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
490 remove_chunk_from_tree(retTC);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
491 assert(retTC->is_free(), "Header is not marked correctly");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
492 }
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 if (FLSVerifyDictionary) {
a61af66fc99e Initial load
duke
parents:
diff changeset
495 verify();
a61af66fc99e Initial load
duke
parents:
diff changeset
496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
497 return retTC;
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
500 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
501 TreeList<Chunk_t, FreeList_t>* BinaryTreeDictionary<Chunk_t, FreeList_t>::find_list(size_t size) const {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
502 TreeList<Chunk_t, FreeList_t>* curTL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
503 for (curTL = root(); curTL != NULL;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
504 if (curTL->size() == size) { // exact match
a61af66fc99e Initial load
duke
parents:
diff changeset
505 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
506 }
a61af66fc99e Initial load
duke
parents:
diff changeset
507
a61af66fc99e Initial load
duke
parents:
diff changeset
508 if (curTL->size() < size) { // proceed to right sub-tree
a61af66fc99e Initial load
duke
parents:
diff changeset
509 curTL = curTL->right();
a61af66fc99e Initial load
duke
parents:
diff changeset
510 } else { // proceed to left sub-tree
a61af66fc99e Initial load
duke
parents:
diff changeset
511 assert(curTL->size() > size, "size inconsistency");
a61af66fc99e Initial load
duke
parents:
diff changeset
512 curTL = curTL->left();
a61af66fc99e Initial load
duke
parents:
diff changeset
513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515 return curTL;
a61af66fc99e Initial load
duke
parents:
diff changeset
516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
519 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
520 bool BinaryTreeDictionary<Chunk_t, FreeList_t>::verify_chunk_in_free_list(Chunk_t* tc) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
521 size_t size = tc->size();
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
522 TreeList<Chunk_t, FreeList_t>* tl = find_list(size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
523 if (tl == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
524 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
525 } else {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
526 return tl->verify_chunk_in_free_list(tc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
527 }
a61af66fc99e Initial load
duke
parents:
diff changeset
528 }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
530 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
531 Chunk_t* BinaryTreeDictionary<Chunk_t, FreeList_t>::find_largest_dict() const {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
532 TreeList<Chunk_t, FreeList_t> *curTL = root();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
533 if (curTL != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
534 while(curTL->right() != NULL) curTL = curTL->right();
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
535 return curTL->largest_address();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
536 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
537 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
538 }
a61af66fc99e Initial load
duke
parents:
diff changeset
539 }
a61af66fc99e Initial load
duke
parents:
diff changeset
540
a61af66fc99e Initial load
duke
parents:
diff changeset
541 // Remove the current chunk from the tree. If it is not the last
a61af66fc99e Initial load
duke
parents:
diff changeset
542 // chunk in a list on a tree node, just unlink it.
a61af66fc99e Initial load
duke
parents:
diff changeset
543 // If it is the last chunk in the list (the next link is NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
544 // remove the node and repair the tree.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
545 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
546 TreeChunk<Chunk_t, FreeList_t>*
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
547 BinaryTreeDictionary<Chunk_t, FreeList_t>::remove_chunk_from_tree(TreeChunk<Chunk_t, FreeList_t>* tc) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
548 assert(tc != NULL, "Should not call with a NULL chunk");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
549 assert(tc->is_free(), "Header is not marked correctly");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
550
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
551 TreeList<Chunk_t, FreeList_t> *newTL, *parentTL;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
552 TreeChunk<Chunk_t, FreeList_t>* retTC;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
553 TreeList<Chunk_t, FreeList_t>* tl = tc->list();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
554 debug_only(
a61af66fc99e Initial load
duke
parents:
diff changeset
555 bool removing_only_chunk = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
556 if (tl == _root) {
a61af66fc99e Initial load
duke
parents:
diff changeset
557 if ((_root->left() == NULL) && (_root->right() == NULL)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
558 if (_root->count() == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
559 assert(_root->head() == tc, "Should only be this one chunk");
a61af66fc99e Initial load
duke
parents:
diff changeset
560 removing_only_chunk = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
562 }
a61af66fc99e Initial load
duke
parents:
diff changeset
563 }
a61af66fc99e Initial load
duke
parents:
diff changeset
564 )
a61af66fc99e Initial load
duke
parents:
diff changeset
565 assert(tl != NULL, "List should be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
566 assert(tl->parent() == NULL || tl == tl->parent()->left() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
567 tl == tl->parent()->right(), "list is inconsistent");
a61af66fc99e Initial load
duke
parents:
diff changeset
568
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
569 bool complicated_splice = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 retTC = tc;
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // Removing this chunk can have the side effect of changing the node
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
573 // (TreeList<Chunk_t, FreeList_t>*) in the tree. If the node is the root, update it.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
574 TreeList<Chunk_t, FreeList_t>* replacementTL = tl->remove_chunk_replace_if_needed(tc);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
575 assert(tc->is_free(), "Chunk should still be free");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
576 assert(replacementTL->parent() == NULL ||
a61af66fc99e Initial load
duke
parents:
diff changeset
577 replacementTL == replacementTL->parent()->left() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
578 replacementTL == replacementTL->parent()->right(),
a61af66fc99e Initial load
duke
parents:
diff changeset
579 "list is inconsistent");
a61af66fc99e Initial load
duke
parents:
diff changeset
580 if (tl == root()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 assert(replacementTL->parent() == NULL, "Incorrectly replacing root");
a61af66fc99e Initial load
duke
parents:
diff changeset
582 set_root(replacementTL);
a61af66fc99e Initial load
duke
parents:
diff changeset
583 }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
584 #ifdef ASSERT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
585 if (tl != replacementTL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
586 assert(replacementTL->head() != NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
587 "If the tree list was replaced, it should not be a NULL list");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
588 TreeList<Chunk_t, FreeList_t>* rhl = replacementTL->head_as_TreeChunk()->list();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
589 TreeList<Chunk_t, FreeList_t>* rtl =
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
590 TreeChunk<Chunk_t, FreeList_t>::as_TreeChunk(replacementTL->tail())->list();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
591 assert(rhl == replacementTL, "Broken head");
a61af66fc99e Initial load
duke
parents:
diff changeset
592 assert(rtl == replacementTL, "Broken tail");
a61af66fc99e Initial load
duke
parents:
diff changeset
593 assert(replacementTL->size() == tc->size(), "Broken size");
a61af66fc99e Initial load
duke
parents:
diff changeset
594 }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
595 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597 // Does the tree need to be repaired?
a61af66fc99e Initial load
duke
parents:
diff changeset
598 if (replacementTL->count() == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
599 assert(replacementTL->head() == NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
600 replacementTL->tail() == NULL, "list count is incorrect");
a61af66fc99e Initial load
duke
parents:
diff changeset
601 // Find the replacement node for the (soon to be empty) node being removed.
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // if we have a single (or no) child, splice child in our stead
a61af66fc99e Initial load
duke
parents:
diff changeset
603 if (replacementTL->left() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // left is NULL so pick right. right may also be NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
605 newTL = replacementTL->right();
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
606 debug_only(replacementTL->clear_right();)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
607 } else if (replacementTL->right() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
608 // right is NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
609 newTL = replacementTL->left();
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
610 debug_only(replacementTL->clear_left();)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
611 } else { // we have both children, so, by patriarchal convention,
a61af66fc99e Initial load
duke
parents:
diff changeset
612 // my replacement is least node in right sub-tree
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
613 complicated_splice = true;
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
614 newTL = remove_tree_minimum(replacementTL->right());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
615 assert(newTL != NULL && newTL->left() == NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
616 newTL->right() == NULL, "sub-tree minimum exists");
a61af66fc99e Initial load
duke
parents:
diff changeset
617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // newTL is the replacement for the (soon to be empty) node.
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // newTL may be NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // should verify; we just cleanly excised our replacement
a61af66fc99e Initial load
duke
parents:
diff changeset
621 if (FLSVerifyDictionary) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
622 verify_tree();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
623 }
a61af66fc99e Initial load
duke
parents:
diff changeset
624 // first make newTL my parent's child
a61af66fc99e Initial load
duke
parents:
diff changeset
625 if ((parentTL = replacementTL->parent()) == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
626 // newTL should be root
a61af66fc99e Initial load
duke
parents:
diff changeset
627 assert(tl == root(), "Incorrectly replacing root");
a61af66fc99e Initial load
duke
parents:
diff changeset
628 set_root(newTL);
a61af66fc99e Initial load
duke
parents:
diff changeset
629 if (newTL != NULL) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
630 newTL->clear_parent();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
631 }
a61af66fc99e Initial load
duke
parents:
diff changeset
632 } else if (parentTL->right() == replacementTL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
633 // replacementTL is a right child
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
634 parentTL->set_right(newTL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
635 } else { // replacementTL is a left child
a61af66fc99e Initial load
duke
parents:
diff changeset
636 assert(parentTL->left() == replacementTL, "should be left child");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
637 parentTL->set_left(newTL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
638 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
639 debug_only(replacementTL->clear_parent();)
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
640 if (complicated_splice) { // we need newTL to get replacementTL's
0
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // two children
a61af66fc99e Initial load
duke
parents:
diff changeset
642 assert(newTL != NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
643 newTL->left() == NULL && newTL->right() == NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
644 "newTL should not have encumbrances from the past");
a61af66fc99e Initial load
duke
parents:
diff changeset
645 // we'd like to assert as below:
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // assert(replacementTL->left() != NULL && replacementTL->right() != NULL,
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
647 // "else !complicated_splice");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
648 // ... however, the above assertion is too strong because we aren't
a61af66fc99e Initial load
duke
parents:
diff changeset
649 // guaranteed that replacementTL->right() is still NULL.
a61af66fc99e Initial load
duke
parents:
diff changeset
650 // Recall that we removed
a61af66fc99e Initial load
duke
parents:
diff changeset
651 // the right sub-tree minimum from replacementTL.
a61af66fc99e Initial load
duke
parents:
diff changeset
652 // That may well have been its right
a61af66fc99e Initial load
duke
parents:
diff changeset
653 // child! So we'll just assert half of the above:
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
654 assert(replacementTL->left() != NULL, "else !complicated_splice");
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
655 newTL->set_left(replacementTL->left());
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
656 newTL->set_right(replacementTL->right());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
657 debug_only(
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
658 replacementTL->clear_right();
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
659 replacementTL->clear_left();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
660 )
a61af66fc99e Initial load
duke
parents:
diff changeset
661 }
a61af66fc99e Initial load
duke
parents:
diff changeset
662 assert(replacementTL->right() == NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
663 replacementTL->left() == NULL &&
a61af66fc99e Initial load
duke
parents:
diff changeset
664 replacementTL->parent() == NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
665 "delete without encumbrances");
a61af66fc99e Initial load
duke
parents:
diff changeset
666 }
a61af66fc99e Initial load
duke
parents:
diff changeset
667
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
668 assert(total_size() >= retTC->size(), "Incorrect total size");
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
669 dec_total_size(retTC->size()); // size book-keeping
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
670 assert(total_free_blocks() > 0, "Incorrect total count");
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
671 set_total_free_blocks(total_free_blocks() - 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
672
a61af66fc99e Initial load
duke
parents:
diff changeset
673 assert(retTC != NULL, "null chunk?");
a61af66fc99e Initial load
duke
parents:
diff changeset
674 assert(retTC->prev() == NULL && retTC->next() == NULL,
a61af66fc99e Initial load
duke
parents:
diff changeset
675 "should return without encumbrances");
a61af66fc99e Initial load
duke
parents:
diff changeset
676 if (FLSVerifyDictionary) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
677 verify_tree();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
678 }
a61af66fc99e Initial load
duke
parents:
diff changeset
679 assert(!removing_only_chunk || _root == NULL, "root should be NULL");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
680 return TreeChunk<Chunk_t, FreeList_t>::as_TreeChunk(retTC);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 // Remove the leftmost node (lm) in the tree and return it.
a61af66fc99e Initial load
duke
parents:
diff changeset
684 // If lm has a right child, link it to the left node of
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // the parent of lm.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
686 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
687 TreeList<Chunk_t, FreeList_t>* BinaryTreeDictionary<Chunk_t, FreeList_t>::remove_tree_minimum(TreeList<Chunk_t, FreeList_t>* tl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
688 assert(tl != NULL && tl->parent() != NULL, "really need a proper sub-tree");
a61af66fc99e Initial load
duke
parents:
diff changeset
689 // locate the subtree minimum by walking down left branches
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
690 TreeList<Chunk_t, FreeList_t>* curTL = tl;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
691 for (; curTL->left() != NULL; curTL = curTL->left());
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // obviously curTL now has at most one child, a right child
a61af66fc99e Initial load
duke
parents:
diff changeset
693 if (curTL != root()) { // Should this test just be removed?
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
694 TreeList<Chunk_t, FreeList_t>* parentTL = curTL->parent();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
695 if (parentTL->left() == curTL) { // curTL is a left child
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
696 parentTL->set_left(curTL->right());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
697 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
698 // If the list tl has no left child, then curTL may be
a61af66fc99e Initial load
duke
parents:
diff changeset
699 // the right child of parentTL.
a61af66fc99e Initial load
duke
parents:
diff changeset
700 assert(parentTL->right() == curTL, "should be a right child");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
701 parentTL->set_right(curTL->right());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
702 }
a61af66fc99e Initial load
duke
parents:
diff changeset
703 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
704 // The only use of this method would not pass the root of the
a61af66fc99e Initial load
duke
parents:
diff changeset
705 // tree (as indicated by the assertion above that the tree list
a61af66fc99e Initial load
duke
parents:
diff changeset
706 // has a parent) but the specification does not explicitly exclude the
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // passing of the root so accomodate it.
a61af66fc99e Initial load
duke
parents:
diff changeset
708 set_root(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
709 }
a61af66fc99e Initial load
duke
parents:
diff changeset
710 debug_only(
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
711 curTL->clear_parent(); // Test if this needs to be cleared
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
712 curTL->clear_right(); // recall, above, left child is already null
0
a61af66fc99e Initial load
duke
parents:
diff changeset
713 )
a61af66fc99e Initial load
duke
parents:
diff changeset
714 // we just excised a (non-root) node, we should still verify all tree invariants
a61af66fc99e Initial load
duke
parents:
diff changeset
715 if (FLSVerifyDictionary) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
716 verify_tree();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
717 }
a61af66fc99e Initial load
duke
parents:
diff changeset
718 return curTL;
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
721 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
722 void BinaryTreeDictionary<Chunk_t, FreeList_t>::insert_chunk_in_tree(Chunk_t* fc) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
723 TreeList<Chunk_t, FreeList_t> *curTL, *prevTL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
724 size_t size = fc->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
725
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
726 assert((size >= min_size()),
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
727 err_msg(SIZE_FORMAT " is too small to be a TreeChunk<Chunk_t, FreeList_t> " SIZE_FORMAT,
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
728 size, min_size()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
729 if (FLSVerifyDictionary) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
730 verify_tree();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
731 }
a61af66fc99e Initial load
duke
parents:
diff changeset
732
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
733 fc->clear_next();
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
734 fc->link_prev(NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
735
a61af66fc99e Initial load
duke
parents:
diff changeset
736 // work down from the _root, looking for insertion point
a61af66fc99e Initial load
duke
parents:
diff changeset
737 for (prevTL = curTL = root(); curTL != NULL;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
738 if (curTL->size() == size) // exact match
a61af66fc99e Initial load
duke
parents:
diff changeset
739 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
740 prevTL = curTL;
a61af66fc99e Initial load
duke
parents:
diff changeset
741 if (curTL->size() > size) { // follow left branch
a61af66fc99e Initial load
duke
parents:
diff changeset
742 curTL = curTL->left();
a61af66fc99e Initial load
duke
parents:
diff changeset
743 } else { // follow right branch
a61af66fc99e Initial load
duke
parents:
diff changeset
744 assert(curTL->size() < size, "size inconsistency");
a61af66fc99e Initial load
duke
parents:
diff changeset
745 curTL = curTL->right();
a61af66fc99e Initial load
duke
parents:
diff changeset
746 }
a61af66fc99e Initial load
duke
parents:
diff changeset
747 }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
748 TreeChunk<Chunk_t, FreeList_t>* tc = TreeChunk<Chunk_t, FreeList_t>::as_TreeChunk(fc);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
749 // This chunk is being returned to the binary tree. Its embedded
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
750 // TreeList<Chunk_t, FreeList_t> should be unused at this point.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
751 tc->initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
752 if (curTL != NULL) { // exact match
a61af66fc99e Initial load
duke
parents:
diff changeset
753 tc->set_list(curTL);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
754 curTL->return_chunk_at_tail(tc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
755 } else { // need a new node in tree
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
756 tc->clear_next();
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
757 tc->link_prev(NULL);
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
758 TreeList<Chunk_t, FreeList_t>* newTL = TreeList<Chunk_t, FreeList_t>::as_TreeList(tc);
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
759 assert(((TreeChunk<Chunk_t, FreeList_t>*)tc)->list() == newTL,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
760 "List was not initialized correctly");
a61af66fc99e Initial load
duke
parents:
diff changeset
761 if (prevTL == NULL) { // we are the only tree node
a61af66fc99e Initial load
duke
parents:
diff changeset
762 assert(root() == NULL, "control point invariant");
a61af66fc99e Initial load
duke
parents:
diff changeset
763 set_root(newTL);
a61af66fc99e Initial load
duke
parents:
diff changeset
764 } else { // insert under prevTL ...
a61af66fc99e Initial load
duke
parents:
diff changeset
765 if (prevTL->size() < size) { // am right child
a61af66fc99e Initial load
duke
parents:
diff changeset
766 assert(prevTL->right() == NULL, "control point invariant");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
767 prevTL->set_right(newTL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
768 } else { // am left child
a61af66fc99e Initial load
duke
parents:
diff changeset
769 assert(prevTL->size() > size && prevTL->left() == NULL, "cpt pt inv");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
770 prevTL->set_left(newTL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
771 }
a61af66fc99e Initial load
duke
parents:
diff changeset
772 }
a61af66fc99e Initial load
duke
parents:
diff changeset
773 }
a61af66fc99e Initial load
duke
parents:
diff changeset
774 assert(tc->list() != NULL, "Tree list should be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
775
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
776 inc_total_size(size);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
777 // Method 'total_size_in_tree' walks through the every block in the
0
a61af66fc99e Initial load
duke
parents:
diff changeset
778 // tree, so it can cause significant performance loss if there are
a61af66fc99e Initial load
duke
parents:
diff changeset
779 // many blocks in the tree
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
780 assert(!FLSVerifyDictionary || total_size_in_tree(root()) == total_size(), "_total_size inconsistency");
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
781 set_total_free_blocks(total_free_blocks() + 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
782 if (FLSVerifyDictionary) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
783 verify_tree();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
785 }
a61af66fc99e Initial load
duke
parents:
diff changeset
786
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
787 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
788 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::max_chunk_size() const {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
789 FreeBlockDictionary<Chunk_t>::verify_par_locked();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
790 TreeList<Chunk_t, FreeList_t>* tc = root();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
791 if (tc == NULL) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
792 for (; tc->right() != NULL; tc = tc->right());
a61af66fc99e Initial load
duke
parents:
diff changeset
793 return tc->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
794 }
a61af66fc99e Initial load
duke
parents:
diff changeset
795
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
796 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
797 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::total_list_length(TreeList<Chunk_t, FreeList_t>* tl) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
798 size_t res;
a61af66fc99e Initial load
duke
parents:
diff changeset
799 res = tl->count();
a61af66fc99e Initial load
duke
parents:
diff changeset
800 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
801 size_t cnt;
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
802 Chunk_t* tc = tl->head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
803 for (cnt = 0; tc != NULL; tc = tc->next(), cnt++);
a61af66fc99e Initial load
duke
parents:
diff changeset
804 assert(res == cnt, "The count is not being maintained correctly");
a61af66fc99e Initial load
duke
parents:
diff changeset
805 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
806 return res;
a61af66fc99e Initial load
duke
parents:
diff changeset
807 }
a61af66fc99e Initial load
duke
parents:
diff changeset
808
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
809 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
810 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::total_size_in_tree(TreeList<Chunk_t, FreeList_t>* tl) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
811 if (tl == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
812 return 0;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
813 return (tl->size() * total_list_length(tl)) +
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
814 total_size_in_tree(tl->left()) +
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
815 total_size_in_tree(tl->right());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
816 }
a61af66fc99e Initial load
duke
parents:
diff changeset
817
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
818 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
819 double BinaryTreeDictionary<Chunk_t, FreeList_t>::sum_of_squared_block_sizes(TreeList<Chunk_t, FreeList_t>* const tl) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
820 if (tl == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
821 return 0.0;
a61af66fc99e Initial load
duke
parents:
diff changeset
822 }
a61af66fc99e Initial load
duke
parents:
diff changeset
823 double size = (double)(tl->size());
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
824 double curr = size * size * total_list_length(tl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
825 curr += sum_of_squared_block_sizes(tl->left());
a61af66fc99e Initial load
duke
parents:
diff changeset
826 curr += sum_of_squared_block_sizes(tl->right());
a61af66fc99e Initial load
duke
parents:
diff changeset
827 return curr;
a61af66fc99e Initial load
duke
parents:
diff changeset
828 }
a61af66fc99e Initial load
duke
parents:
diff changeset
829
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
830 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
831 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::total_free_blocks_in_tree(TreeList<Chunk_t, FreeList_t>* tl) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
832 if (tl == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
833 return 0;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
834 return total_list_length(tl) +
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
835 total_free_blocks_in_tree(tl->left()) +
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
836 total_free_blocks_in_tree(tl->right());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
837 }
a61af66fc99e Initial load
duke
parents:
diff changeset
838
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
839 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
840 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::num_free_blocks() const {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
841 assert(total_free_blocks_in_tree(root()) == total_free_blocks(),
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
842 "_total_free_blocks inconsistency");
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
843 return total_free_blocks();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
844 }
a61af66fc99e Initial load
duke
parents:
diff changeset
845
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
846 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
847 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::tree_height_helper(TreeList<Chunk_t, FreeList_t>* tl) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
848 if (tl == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
849 return 0;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
850 return 1 + MAX2(tree_height_helper(tl->left()),
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
851 tree_height_helper(tl->right()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
852 }
a61af66fc99e Initial load
duke
parents:
diff changeset
853
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
854 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
855 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::tree_height() const {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
856 return tree_height_helper(root());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
857 }
a61af66fc99e Initial load
duke
parents:
diff changeset
858
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
859 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
860 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::total_nodes_helper(TreeList<Chunk_t, FreeList_t>* tl) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
861 if (tl == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
862 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
863 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
864 return 1 + total_nodes_helper(tl->left()) +
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
865 total_nodes_helper(tl->right());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
866 }
a61af66fc99e Initial load
duke
parents:
diff changeset
867
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
868 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
869 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::total_nodes_in_tree(TreeList<Chunk_t, FreeList_t>* tl) const {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
870 return total_nodes_helper(root());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
871 }
a61af66fc99e Initial load
duke
parents:
diff changeset
872
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
873 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
874 void BinaryTreeDictionary<Chunk_t, FreeList_t>::dict_census_update(size_t size, bool split, bool birth){}
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
875
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
876 #if INCLUDE_ALL_GCS
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
877 template <>
7947
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7446
diff changeset
878 void AFLBinaryTreeDictionary::dict_census_update(size_t size, bool split, bool birth){
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
879 TreeList<FreeChunk, AdaptiveFreeList>* nd = find_list(size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
880 if (nd) {
a61af66fc99e Initial load
duke
parents:
diff changeset
881 if (split) {
a61af66fc99e Initial load
duke
parents:
diff changeset
882 if (birth) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
883 nd->increment_split_births();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
884 nd->increment_surplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
885 } else {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
886 nd->increment_split_deaths();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
887 nd->decrement_surplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
888 }
a61af66fc99e Initial load
duke
parents:
diff changeset
889 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
890 if (birth) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
891 nd->increment_coal_births();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
892 nd->increment_surplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
893 } else {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
894 nd->increment_coal_deaths();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
895 nd->decrement_surplus();
a61af66fc99e Initial load
duke
parents:
diff changeset
896 }
a61af66fc99e Initial load
duke
parents:
diff changeset
897 }
a61af66fc99e Initial load
duke
parents:
diff changeset
898 }
a61af66fc99e Initial load
duke
parents:
diff changeset
899 // A list for this size may not be found (nd == 0) if
a61af66fc99e Initial load
duke
parents:
diff changeset
900 // This is a death where the appropriate list is now
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // empty and has been removed from the list.
a61af66fc99e Initial load
duke
parents:
diff changeset
902 // This is a birth associated with a LinAB. The chunk
a61af66fc99e Initial load
duke
parents:
diff changeset
903 // for the LinAB is not in the dictionary.
a61af66fc99e Initial load
duke
parents:
diff changeset
904 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
905 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
906
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
907 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
908 bool BinaryTreeDictionary<Chunk_t, FreeList_t>::coal_dict_over_populated(size_t size) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
909 // For the general type of freelists, encourage coalescing by
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
910 // returning true.
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
911 return true;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
912 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
913
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
914 #if INCLUDE_ALL_GCS
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
915 template <>
7947
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7446
diff changeset
916 bool AFLBinaryTreeDictionary::coal_dict_over_populated(size_t size) {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
917 if (FLSAlwaysCoalesceLarge) return true;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
918
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
919 TreeList<FreeChunk, AdaptiveFreeList>* list_of_size = find_list(size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
920 // None of requested size implies overpopulated.
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
921 return list_of_size == NULL || list_of_size->coal_desired() <= 0 ||
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
922 list_of_size->count() > list_of_size->coal_desired();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
923 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
924 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
925
a61af66fc99e Initial load
duke
parents:
diff changeset
926 // Closures for walking the binary tree.
a61af66fc99e Initial load
duke
parents:
diff changeset
927 // do_list() walks the free list in a node applying the closure
a61af66fc99e Initial load
duke
parents:
diff changeset
928 // to each free chunk in the list
a61af66fc99e Initial load
duke
parents:
diff changeset
929 // do_tree() walks the nodes in the binary tree applying do_list()
a61af66fc99e Initial load
duke
parents:
diff changeset
930 // to each list at each node.
a61af66fc99e Initial load
duke
parents:
diff changeset
931
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
932 template <class Chunk_t, template <class> class FreeList_t>
0
a61af66fc99e Initial load
duke
parents:
diff changeset
933 class TreeCensusClosure : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
934 protected:
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
935 virtual void do_list(FreeList_t<Chunk_t>* fl) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
936 public:
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
937 virtual void do_tree(TreeList<Chunk_t, FreeList_t>* tl) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
938 };
a61af66fc99e Initial load
duke
parents:
diff changeset
939
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
940 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
941 class AscendTreeCensusClosure : public TreeCensusClosure<Chunk_t, FreeList_t> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
942 public:
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
943 void do_tree(TreeList<Chunk_t, FreeList_t>* tl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
944 if (tl != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
945 do_tree(tl->left());
6970
0400886d2613 8003259: NPG: Build with gcc 4.7.2 broken by 7045397
coleenp
parents: 6885
diff changeset
946 this->do_list(tl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
947 do_tree(tl->right());
a61af66fc99e Initial load
duke
parents:
diff changeset
948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
949 }
a61af66fc99e Initial load
duke
parents:
diff changeset
950 };
a61af66fc99e Initial load
duke
parents:
diff changeset
951
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
952 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
953 class DescendTreeCensusClosure : public TreeCensusClosure<Chunk_t, FreeList_t> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
954 public:
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
955 void do_tree(TreeList<Chunk_t, FreeList_t>* tl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
956 if (tl != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
957 do_tree(tl->right());
6970
0400886d2613 8003259: NPG: Build with gcc 4.7.2 broken by 7045397
coleenp
parents: 6885
diff changeset
958 this->do_list(tl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
959 do_tree(tl->left());
a61af66fc99e Initial load
duke
parents:
diff changeset
960 }
a61af66fc99e Initial load
duke
parents:
diff changeset
961 }
a61af66fc99e Initial load
duke
parents:
diff changeset
962 };
a61af66fc99e Initial load
duke
parents:
diff changeset
963
a61af66fc99e Initial load
duke
parents:
diff changeset
964 // For each list in the tree, calculate the desired, desired
a61af66fc99e Initial load
duke
parents:
diff changeset
965 // coalesce, count before sweep, and surplus before sweep.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
966 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
967 class BeginSweepClosure : public AscendTreeCensusClosure<Chunk_t, FreeList_t> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
968 double _percentage;
a61af66fc99e Initial load
duke
parents:
diff changeset
969 float _inter_sweep_current;
a61af66fc99e Initial load
duke
parents:
diff changeset
970 float _inter_sweep_estimate;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
971 float _intra_sweep_estimate;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
972
a61af66fc99e Initial load
duke
parents:
diff changeset
973 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
974 BeginSweepClosure(double p, float inter_sweep_current,
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
975 float inter_sweep_estimate,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
976 float intra_sweep_estimate) :
0
a61af66fc99e Initial load
duke
parents:
diff changeset
977 _percentage(p),
a61af66fc99e Initial load
duke
parents:
diff changeset
978 _inter_sweep_current(inter_sweep_current),
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
979 _inter_sweep_estimate(inter_sweep_estimate),
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
980 _intra_sweep_estimate(intra_sweep_estimate) { }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
981
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
982 void do_list(FreeList<Chunk_t>* fl) {}
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
983
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
984 #if INCLUDE_ALL_GCS
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
985 void do_list(AdaptiveFreeList<Chunk_t>* fl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
986 double coalSurplusPercent = _percentage;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
987 fl->compute_desired(_inter_sweep_current, _inter_sweep_estimate, _intra_sweep_estimate);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
988 fl->set_coal_desired((ssize_t)((double)fl->desired() * coalSurplusPercent));
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
989 fl->set_before_sweep(fl->count());
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
990 fl->set_bfr_surp(fl->surplus());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
991 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
992 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
993 };
a61af66fc99e Initial load
duke
parents:
diff changeset
994
a61af66fc99e Initial load
duke
parents:
diff changeset
995 // Used to search the tree until a condition is met.
a61af66fc99e Initial load
duke
parents:
diff changeset
996 // Similar to TreeCensusClosure but searches the
a61af66fc99e Initial load
duke
parents:
diff changeset
997 // tree and returns promptly when found.
a61af66fc99e Initial load
duke
parents:
diff changeset
998
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
999 template <class Chunk_t, template <class> class FreeList_t>
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 class TreeSearchClosure : public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
1001 protected:
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1002 virtual bool do_list(FreeList_t<Chunk_t>* fl) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 public:
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1004 virtual bool do_tree(TreeList<Chunk_t, FreeList_t>* tl) = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1006
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 #if 0 // Don't need this yet but here for symmetry.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1008 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1009 class AscendTreeSearchClosure : public TreeSearchClosure<Chunk_t> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 public:
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1011 bool do_tree(TreeList<Chunk_t, FreeList_t>* tl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 if (tl != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 if (do_tree(tl->left())) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1014 if (do_list(tl)) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 if (do_tree(tl->right())) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1017 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
1021
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1022 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1023 class DescendTreeSearchClosure : public TreeSearchClosure<Chunk_t, FreeList_t> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 public:
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1025 bool do_tree(TreeList<Chunk_t, FreeList_t>* tl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1026 if (tl != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 if (do_tree(tl->right())) return true;
6970
0400886d2613 8003259: NPG: Build with gcc 4.7.2 broken by 7045397
coleenp
parents: 6885
diff changeset
1028 if (this->do_list(tl)) return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 if (do_tree(tl->left())) return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1030 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1031 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1034
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 // Searches the tree for a chunk that ends at the
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 // specified address.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1037 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1038 class EndTreeSearchClosure : public DescendTreeSearchClosure<Chunk_t, FreeList_t> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 HeapWord* _target;
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1040 Chunk_t* _found;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1041
a61af66fc99e Initial load
duke
parents:
diff changeset
1042 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1043 EndTreeSearchClosure(HeapWord* target) : _target(target), _found(NULL) {}
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1044 bool do_list(FreeList_t<Chunk_t>* fl) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1045 Chunk_t* item = fl->head();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1046 while (item != NULL) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1047 if (item->end() == (uintptr_t*) _target) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 _found = item;
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 item = item->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1054 }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1055 Chunk_t* found() { return _found; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1057
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1058 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1059 Chunk_t* BinaryTreeDictionary<Chunk_t, FreeList_t>::find_chunk_ends_at(HeapWord* target) const {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1060 EndTreeSearchClosure<Chunk_t, FreeList_t> etsc(target);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 bool found_target = etsc.do_tree(root());
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 assert(found_target || etsc.found() == NULL, "Consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 assert(!found_target || etsc.found() != NULL, "Consistency check");
a61af66fc99e Initial load
duke
parents:
diff changeset
1064 return etsc.found();
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1066
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1067 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1068 void BinaryTreeDictionary<Chunk_t, FreeList_t>::begin_sweep_dict_census(double coalSurplusPercent,
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1069 float inter_sweep_current, float inter_sweep_estimate, float intra_sweep_estimate) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1070 BeginSweepClosure<Chunk_t, FreeList_t> bsc(coalSurplusPercent, inter_sweep_current,
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1071 inter_sweep_estimate,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1072 intra_sweep_estimate);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 bsc.do_tree(root());
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1075
a61af66fc99e Initial load
duke
parents:
diff changeset
1076 // Closures and methods for calculating total bytes returned to the
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 // free lists in the tree.
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1078 #ifndef PRODUCT
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1079 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1080 class InitializeDictReturnedBytesClosure : public AscendTreeCensusClosure<Chunk_t, FreeList_t> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1081 public:
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1082 void do_list(FreeList_t<Chunk_t>* fl) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1083 fl->set_returned_bytes(0);
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1084 }
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1085 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1086
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1087 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1088 void BinaryTreeDictionary<Chunk_t, FreeList_t>::initialize_dict_returned_bytes() {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1089 InitializeDictReturnedBytesClosure<Chunk_t, FreeList_t> idrb;
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1090 idrb.do_tree(root());
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1091 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1092
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1093 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1094 class ReturnedBytesClosure : public AscendTreeCensusClosure<Chunk_t, FreeList_t> {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1095 size_t _dict_returned_bytes;
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1096 public:
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1097 ReturnedBytesClosure() { _dict_returned_bytes = 0; }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1098 void do_list(FreeList_t<Chunk_t>* fl) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1099 _dict_returned_bytes += fl->returned_bytes();
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1100 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1101 size_t dict_returned_bytes() { return _dict_returned_bytes; }
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1102 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1103
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1104 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1105 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::sum_dict_returned_bytes() {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1106 ReturnedBytesClosure<Chunk_t, FreeList_t> rbc;
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1107 rbc.do_tree(root());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1108
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1109 return rbc.dict_returned_bytes();
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1110 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1111
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1112 // Count the number of entries in the tree.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1113 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1114 class treeCountClosure : public DescendTreeCensusClosure<Chunk_t, FreeList_t> {
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1115 public:
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1116 uint count;
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1117 treeCountClosure(uint c) { count = c; }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1118 void do_list(FreeList_t<Chunk_t>* fl) {
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1119 count++;
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1120 }
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1121 };
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1122
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1123 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1124 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::total_count() {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1125 treeCountClosure<Chunk_t, FreeList_t> ctc(0);
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1126 ctc.do_tree(root());
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1127 return ctc.count;
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1128 }
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1129 #endif // PRODUCT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1130
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 // Calculate surpluses for the lists in the tree.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1132 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1133 class setTreeSurplusClosure : public AscendTreeCensusClosure<Chunk_t, FreeList_t> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 double percentage;
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 setTreeSurplusClosure(double v) { percentage = v; }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1137 void do_list(FreeList<Chunk_t>* fl) {}
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1138
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1139 #if INCLUDE_ALL_GCS
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1140 void do_list(AdaptiveFreeList<Chunk_t>* fl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 double splitSurplusPercent = percentage;
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 fl->set_surplus(fl->count() -
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 (ssize_t)((double)fl->desired() * splitSurplusPercent));
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1145 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1147
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1148 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1149 void BinaryTreeDictionary<Chunk_t, FreeList_t>::set_tree_surplus(double splitSurplusPercent) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1150 setTreeSurplusClosure<Chunk_t, FreeList_t> sts(splitSurplusPercent);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 sts.do_tree(root());
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1153
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 // Set hints for the lists in the tree.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1155 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1156 class setTreeHintsClosure : public DescendTreeCensusClosure<Chunk_t, FreeList_t> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 size_t hint;
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 setTreeHintsClosure(size_t v) { hint = v; }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1160 void do_list(FreeList<Chunk_t>* fl) {}
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1161
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1162 #if INCLUDE_ALL_GCS
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1163 void do_list(AdaptiveFreeList<Chunk_t>* fl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 fl->set_hint(hint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 assert(fl->hint() == 0 || fl->hint() > fl->size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 "Current hint is inconsistent");
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 if (fl->surplus() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 hint = fl->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1171 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1174 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1175 void BinaryTreeDictionary<Chunk_t, FreeList_t>::set_tree_hints(void) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1176 setTreeHintsClosure<Chunk_t, FreeList_t> sth(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 sth.do_tree(root());
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1179
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 // Save count before previous sweep and splits and coalesces.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1181 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1182 class clearTreeCensusClosure : public AscendTreeCensusClosure<Chunk_t, FreeList_t> {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1183 void do_list(FreeList<Chunk_t>* fl) {}
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1184
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1185 #if INCLUDE_ALL_GCS
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1186 void do_list(AdaptiveFreeList<Chunk_t>* fl) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1187 fl->set_prev_sweep(fl->count());
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1188 fl->set_coal_births(0);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1189 fl->set_coal_deaths(0);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1190 fl->set_split_births(0);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1191 fl->set_split_deaths(0);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1193 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1194 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1195
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1196 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1197 void BinaryTreeDictionary<Chunk_t, FreeList_t>::clear_tree_census(void) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1198 clearTreeCensusClosure<Chunk_t, FreeList_t> ctc;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 ctc.do_tree(root());
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1201
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // Do reporting and post sweep clean up.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1203 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1204 void BinaryTreeDictionary<Chunk_t, FreeList_t>::end_sweep_dict_census(double splitSurplusPercent) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1205 // Does walking the tree 3 times hurt?
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1206 set_tree_surplus(splitSurplusPercent);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1207 set_tree_hints();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 if (PrintGC && Verbose) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1209 report_statistics();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1211 clear_tree_census();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1213
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 // Print summary statistics
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1215 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1216 void BinaryTreeDictionary<Chunk_t, FreeList_t>::report_statistics() const {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1217 FreeBlockDictionary<Chunk_t>::verify_par_locked();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1218 gclog_or_tty->print("Statistics for BinaryTreeDictionary:\n"
a61af66fc99e Initial load
duke
parents:
diff changeset
1219 "------------------------------------\n");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1220 size_t total_size = total_chunk_size(debug_only(NULL));
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1221 size_t free_blocks = num_free_blocks();
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1222 gclog_or_tty->print("Total Free Space: %d\n", total_size);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1223 gclog_or_tty->print("Max Chunk Size: %d\n", max_chunk_size());
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1224 gclog_or_tty->print("Number of Blocks: %d\n", free_blocks);
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1225 if (free_blocks > 0) {
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1226 gclog_or_tty->print("Av. Block Size: %d\n", total_size/free_blocks);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1227 }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1228 gclog_or_tty->print("Tree Height: %d\n", tree_height());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1230
a61af66fc99e Initial load
duke
parents:
diff changeset
1231 // Print census information - counts, births, deaths, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
1232 // for each list in the tree. Also print some summary
a61af66fc99e Initial load
duke
parents:
diff changeset
1233 // information.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1234 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1235 class PrintTreeCensusClosure : public AscendTreeCensusClosure<Chunk_t, FreeList_t> {
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
1236 int _print_line;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1237 size_t _total_free;
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1238 FreeList_t<Chunk_t> _total;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1239
a61af66fc99e Initial load
duke
parents:
diff changeset
1240 public:
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1241 PrintTreeCensusClosure() {
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
1242 _print_line = 0;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1243 _total_free = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1244 }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1245 FreeList_t<Chunk_t>* total() { return &_total; }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1246 size_t total_free() { return _total_free; }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1247 void do_list(FreeList<Chunk_t>* fl) {
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
1248 if (++_print_line >= 40) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1249 FreeList_t<Chunk_t>::print_labels_on(gclog_or_tty, "size");
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
1250 _print_line = 0;
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
1251 }
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
1252 fl->print_on(gclog_or_tty);
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1253 _total_free += fl->count() * fl->size() ;
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
1254 total()->set_count( total()->count() + fl->count() );
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1255 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1256
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1257 #if INCLUDE_ALL_GCS
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1258 void do_list(AdaptiveFreeList<Chunk_t>* fl) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1259 if (++_print_line >= 40) {
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1260 FreeList_t<Chunk_t>::print_labels_on(gclog_or_tty, "size");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1261 _print_line = 0;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1262 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1263 fl->print_on(gclog_or_tty);
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1264 _total_free += fl->count() * fl->size() ;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1265 total()->set_count( total()->count() + fl->count() );
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1266 total()->set_bfr_surp( total()->bfr_surp() + fl->bfr_surp() );
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1267 total()->set_surplus( total()->split_deaths() + fl->surplus() );
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1268 total()->set_desired( total()->desired() + fl->desired() );
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1269 total()->set_prev_sweep( total()->prev_sweep() + fl->prev_sweep() );
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1270 total()->set_before_sweep(total()->before_sweep() + fl->before_sweep());
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1271 total()->set_coal_births( total()->coal_births() + fl->coal_births() );
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1272 total()->set_coal_deaths( total()->coal_deaths() + fl->coal_deaths() );
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1273 total()->set_split_births(total()->split_births() + fl->split_births());
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1274 total()->set_split_deaths(total()->split_deaths() + fl->split_deaths());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1275 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1276 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1277 };
a61af66fc99e Initial load
duke
parents:
diff changeset
1278
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1279 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1280 void BinaryTreeDictionary<Chunk_t, FreeList_t>::print_dict_census(void) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1281
a61af66fc99e Initial load
duke
parents:
diff changeset
1282 gclog_or_tty->print("\nBinaryTree\n");
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1283 FreeList_t<Chunk_t>::print_labels_on(gclog_or_tty, "size");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1284 PrintTreeCensusClosure<Chunk_t, FreeList_t> ptc;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1285 ptc.do_tree(root());
a61af66fc99e Initial load
duke
parents:
diff changeset
1286
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1287 FreeList_t<Chunk_t>* total = ptc.total();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1288 FreeList_t<Chunk_t>::print_labels_on(gclog_or_tty, " ");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1289 }
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1290
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1291 #if INCLUDE_ALL_GCS
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1292 template <>
7947
3c327c2b6782 8004895: NPG: JMapPermCore test failure caused by warnings about missing field
jmasa
parents: 7446
diff changeset
1293 void AFLBinaryTreeDictionary::print_dict_census(void) const {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1294
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1295 gclog_or_tty->print("\nBinaryTree\n");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1296 AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, "size");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1297 PrintTreeCensusClosure<FreeChunk, AdaptiveFreeList> ptc;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1298 ptc.do_tree(root());
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1299
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1300 AdaptiveFreeList<FreeChunk>* total = ptc.total();
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1301 AdaptiveFreeList<FreeChunk>::print_labels_on(gclog_or_tty, " ");
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
1302 total->print_on(gclog_or_tty, "TOTAL\t");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1303 gclog_or_tty->print(
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1304 "total_free(words): " SIZE_FORMAT_W(16)
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
1305 " growth: %8.5f deficit: %8.5f\n",
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1306 ptc.total_free(),
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1307 (double)(total->split_births() + total->coal_births()
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1308 - total->split_deaths() - total->coal_deaths())
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1309 /(total->prev_sweep() != 0 ? (double)total->prev_sweep() : 1.0),
12
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
1310 (double)(total->desired() - total->count())
6432c3bb6240 6668743: CMS: Consolidate block statistics reporting code
ysr
parents: 0
diff changeset
1311 /(total->desired() != 0 ? (double)total->desired() : 1.0));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1312 }
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1313 #endif // INCLUDE_ALL_GCS
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1314
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1315 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1316 class PrintFreeListsClosure : public AscendTreeCensusClosure<Chunk_t, FreeList_t> {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1317 outputStream* _st;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1318 int _print_line;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1319
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1320 public:
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1321 PrintFreeListsClosure(outputStream* st) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1322 _st = st;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1323 _print_line = 0;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1324 }
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1325 void do_list(FreeList_t<Chunk_t>* fl) {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1326 if (++_print_line >= 40) {
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1327 FreeList_t<Chunk_t>::print_labels_on(_st, "size");
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1328 _print_line = 0;
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1329 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1330 fl->print_on(gclog_or_tty);
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1331 size_t sz = fl->size();
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1332 for (Chunk_t* fc = fl->head(); fc != NULL;
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1333 fc = fc->next()) {
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1334 _st->print_cr("\t[" PTR_FORMAT "," PTR_FORMAT ") %s",
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1335 fc, (HeapWord*)fc + sz,
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1336 fc->cantCoalesce() ? "\t CC" : "");
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1337 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1338 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1339 };
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1340
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1341 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1342 void BinaryTreeDictionary<Chunk_t, FreeList_t>::print_free_lists(outputStream* st) const {
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1343
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1344 FreeList_t<Chunk_t>::print_labels_on(st, "size");
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1345 PrintFreeListsClosure<Chunk_t, FreeList_t> pflc(st);
1145
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1346 pflc.do_tree(root());
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1347 }
e018e6884bd8 6631166: CMS: better heuristics when combatting fragmentation
ysr
parents: 269
diff changeset
1348
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1349 // Verify the following tree invariants:
a61af66fc99e Initial load
duke
parents:
diff changeset
1350 // . _root has no parent
a61af66fc99e Initial load
duke
parents:
diff changeset
1351 // . parent and child point to each other
a61af66fc99e Initial load
duke
parents:
diff changeset
1352 // . each node's key correctly related to that of its child(ren)
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1353 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1354 void BinaryTreeDictionary<Chunk_t, FreeList_t>::verify_tree() const {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1355 guarantee(root() == NULL || total_free_blocks() == 0 ||
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1356 total_size() != 0, "_total_size should't be 0?");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1357 guarantee(root() == NULL || root()->parent() == NULL, "_root shouldn't have parent");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1358 verify_tree_helper(root());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1359 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1360
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1361 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1362 size_t BinaryTreeDictionary<Chunk_t, FreeList_t>::verify_prev_free_ptrs(TreeList<Chunk_t, FreeList_t>* tl) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1363 size_t ct = 0;
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1364 for (Chunk_t* curFC = tl->head(); curFC != NULL; curFC = curFC->next()) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1365 ct++;
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1366 assert(curFC->prev() == NULL || curFC->prev()->is_free(),
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1367 "Chunk should be free");
a61af66fc99e Initial load
duke
parents:
diff changeset
1368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1369 return ct;
a61af66fc99e Initial load
duke
parents:
diff changeset
1370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1371
a61af66fc99e Initial load
duke
parents:
diff changeset
1372 // Note: this helper is recursive rather than iterative, so use with
a61af66fc99e Initial load
duke
parents:
diff changeset
1373 // caution on very deep trees; and watch out for stack overflow errors;
a61af66fc99e Initial load
duke
parents:
diff changeset
1374 // In general, to be used only for debugging.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1375 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1376 void BinaryTreeDictionary<Chunk_t, FreeList_t>::verify_tree_helper(TreeList<Chunk_t, FreeList_t>* tl) const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1377 if (tl == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
1378 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1379 guarantee(tl->size() != 0, "A list must has a size");
a61af66fc99e Initial load
duke
parents:
diff changeset
1380 guarantee(tl->left() == NULL || tl->left()->parent() == tl,
a61af66fc99e Initial load
duke
parents:
diff changeset
1381 "parent<-/->left");
a61af66fc99e Initial load
duke
parents:
diff changeset
1382 guarantee(tl->right() == NULL || tl->right()->parent() == tl,
a61af66fc99e Initial load
duke
parents:
diff changeset
1383 "parent<-/->right");;
a61af66fc99e Initial load
duke
parents:
diff changeset
1384 guarantee(tl->left() == NULL || tl->left()->size() < tl->size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1385 "parent !> left");
a61af66fc99e Initial load
duke
parents:
diff changeset
1386 guarantee(tl->right() == NULL || tl->right()->size() > tl->size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1387 "parent !< left");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1388 guarantee(tl->head() == NULL || tl->head()->is_free(), "!Free");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1389 guarantee(tl->head() == NULL || tl->head_as_TreeChunk()->list() == tl,
a61af66fc99e Initial load
duke
parents:
diff changeset
1390 "list inconsistency");
a61af66fc99e Initial load
duke
parents:
diff changeset
1391 guarantee(tl->count() > 0 || (tl->head() == NULL && tl->tail() == NULL),
a61af66fc99e Initial load
duke
parents:
diff changeset
1392 "list count is inconsistent");
a61af66fc99e Initial load
duke
parents:
diff changeset
1393 guarantee(tl->count() > 1 || tl->head() == tl->tail(),
a61af66fc99e Initial load
duke
parents:
diff changeset
1394 "list is incorrectly constructed");
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1395 size_t count = verify_prev_free_ptrs(tl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1396 guarantee(count == (size_t)tl->count(), "Node count is incorrect");
a61af66fc99e Initial load
duke
parents:
diff changeset
1397 if (tl->head() != NULL) {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1398 tl->head_as_TreeChunk()->verify_tree_chunk_list();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1399 }
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1400 verify_tree_helper(tl->left());
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1401 verify_tree_helper(tl->right());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1403
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1404 template <class Chunk_t, template <class> class FreeList_t>
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1405 void BinaryTreeDictionary<Chunk_t, FreeList_t>::verify() const {
6028
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1406 verify_tree();
f69a5d43dc19 7164144: Fix variable naming style in freeBlockDictionary.* and binaryTreeDictionary*
jmasa
parents: 6026
diff changeset
1407 guarantee(total_size() == total_size_in_tree(root()), "Total Size inconsistency");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1408 }
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1409
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1410 template class TreeList<Metablock, FreeList>;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1411 template class BinaryTreeDictionary<Metablock, FreeList>;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1412 template class TreeChunk<Metablock, FreeList>;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1413
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1414 template class TreeList<Metachunk, FreeList>;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1415 template class BinaryTreeDictionary<Metachunk, FreeList>;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1416 template class TreeChunk<Metachunk, FreeList>;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1417
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1418
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1419 #if INCLUDE_ALL_GCS
6026
9f059abe8cf2 7131629: Generalize the CMS free list code
jmasa
parents: 1972
diff changeset
1420 // Explicitly instantiate these types for FreeChunk.
6885
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1421 template class TreeList<FreeChunk, AdaptiveFreeList>;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1422 template class BinaryTreeDictionary<FreeChunk, AdaptiveFreeList>;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1423 template class TreeChunk<FreeChunk, AdaptiveFreeList>;
685df3c6f84b 7045397: NPG: Add freelists to class loader arenas.
jmasa
parents: 6119
diff changeset
1424
8001
db9981fd3124 8005915: Unify SERIALGC and INCLUDE_ALTERNATE_GCS
jprovino
parents: 7446
diff changeset
1425 #endif // INCLUDE_ALL_GCS