annotate src/share/vm/utilities/resourceHash.hpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents bdd155477289
children 3c6ae9109a86 4ca6dc0799b6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
1 /*
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
4 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
7 * published by the Free Software Foundation.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
8 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
13 * accompanied this code).
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
14 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
18 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
21 * questions.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
22 *
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
23 */
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
24
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
25 #ifndef SHARE_VM_UTILITIES_RESOURCEHASH_HPP
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
26 #define SHARE_VM_UTILITIES_RESOURCEHASH_HPP
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
27
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
28 #include "memory/allocation.hpp"
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
29 #include "utilities/top.hpp"
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
30
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
31 template<typename K> struct ResourceHashtableFns {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
32 typedef unsigned (*hash_fn)(K const&);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
33 typedef bool (*equals_fn)(K const&, K const&);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
34 };
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
35
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
36 template<typename K> unsigned primitive_hash(const K& k) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
37 unsigned hash = (unsigned)((uintptr_t)k);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
38 return hash ^ (hash > 3); // just in case we're dealing with aligned ptrs
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
39 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
40
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
41 template<typename K> bool primitive_equals(const K& k0, const K& k1) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
42 return k0 == k1;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
43 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
44
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
45 template<
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
46 typename K, typename V,
14411
bdd155477289 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 6934
diff changeset
47 // xlC does not compile this:
bdd155477289 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 6934
diff changeset
48 // http://stackoverflow.com/questions/8532961/template-argument-of-type-that-is-defined-by-inner-typedef-from-other-template-c
bdd155477289 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 6934
diff changeset
49 //typename ResourceHashtableFns<K>::hash_fn HASH = primitive_hash<K>,
bdd155477289 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 6934
diff changeset
50 //typename ResourceHashtableFns<K>::equals_fn EQUALS = primitive_equals<K>,
bdd155477289 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 6934
diff changeset
51 unsigned (*HASH) (K const&) = primitive_hash<K>,
bdd155477289 8023033: PPC64 (part 13): basic changes for AIX
goetz
parents: 6934
diff changeset
52 bool (*EQUALS)(K const&, K const&) = primitive_equals<K>,
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
53 unsigned SIZE = 256
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
54 >
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
55 class ResourceHashtable : public ResourceObj {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
56 private:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
57
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
58 class Node : public ResourceObj {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
59 public:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
60 unsigned _hash;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
61 K _key;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
62 V _value;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
63 Node* _next;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
64
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
65 Node(unsigned hash, K const& key, V const& value) :
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
66 _hash(hash), _key(key), _value(value), _next(NULL) {}
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
67 };
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
68
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
69 Node* _table[SIZE];
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
70
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
71 // Returns a pointer to where the node where the value would reside if
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
72 // it's in the table.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
73 Node** lookup_node(unsigned hash, K const& key) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
74 unsigned index = hash % SIZE;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
75 Node** ptr = &_table[index];
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
76 while (*ptr != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
77 Node* node = *ptr;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
78 if (node->_hash == hash && EQUALS(key, node->_key)) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
79 break;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
80 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
81 ptr = &(node->_next);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
82 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
83 return ptr;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
84 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
85
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
86 Node const** lookup_node(unsigned hash, K const& key) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
87 return const_cast<Node const**>(
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
88 const_cast<ResourceHashtable*>(this)->lookup_node(hash, key));
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
89 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
90
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
91 public:
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
92 ResourceHashtable() { memset(_table, 0, SIZE * sizeof(Node*)); }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
93
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
94 bool contains(K const& key) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
95 return get(key) != NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
96 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
97
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
98 V* get(K const& key) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
99 unsigned hv = HASH(key);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
100 Node const** ptr = lookup_node(hv, key);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
101 if (*ptr != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
102 return const_cast<V*>(&(*ptr)->_value);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
103 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
104 return NULL;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
105 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
106 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
107
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
108 // Inserts or replaces a value in the table
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
109 void put(K const& key, V const& value) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
110 unsigned hv = HASH(key);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
111 Node** ptr = lookup_node(hv, key);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
112 if (*ptr != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
113 (*ptr)->_value = value;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
114 } else {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
115 *ptr = new Node(hv, key, value);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
116 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
117 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
118
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
119 // ITER contains bool do_entry(K const&, V const&), which will be
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
120 // called for each entry in the table. If do_entry() returns false,
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
121 // the iteration is cancelled.
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
122 template<class ITER>
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
123 void iterate(ITER* iter) const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
124 Node* const* bucket = _table;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
125 while (bucket < &_table[SIZE]) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
126 Node* node = *bucket;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
127 while (node != NULL) {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
128 bool cont = iter->do_entry(node->_key, node->_value);
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
129 if (!cont) { return; }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
130 node = node->_next;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
131 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
132 ++bucket;
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
133 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
134 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
135 };
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
136
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
137
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents:
diff changeset
138 #endif // SHARE_VM_UTILITIES_RESOURCEHASH_HPP