Skip to content

Commit e230719

Browse files
committed
8292448: Convert BitMapFragmentTable to ResourceHashtable
Reviewed-by: iklam, rehn
1 parent f75da22 commit e230719

File tree

3 files changed

+14
-86
lines changed

3 files changed

+14
-86
lines changed

src/hotspot/share/utilities/hashtable.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,6 @@ template class BasicHashtable<mtCode>;
278278
template class BasicHashtable<mtInternal>;
279279
template class BasicHashtable<mtModule>;
280280
template class BasicHashtable<mtCompiler>;
281-
template class BasicHashtable<mtTracing>;
282281
template class BasicHashtable<mtServiceability>;
283282
template class BasicHashtable<mtLogging>;
284283

src/hotspot/share/utilities/objectBitSet.hpp

+8-32
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
#include "oops/oop.hpp"
3030
#include "oops/oopsHierarchy.hpp"
3131
#include "utilities/bitMap.hpp"
32-
#include "utilities/hashtable.hpp"
32+
#include "utilities/resizeableResourceHash.hpp"
3333

3434
class MemRegion;
3535

@@ -47,37 +47,13 @@ class ObjectBitSet : public CHeapObj<F> {
4747

4848
class BitMapFragment;
4949

50-
class BitMapFragmentTable : public BasicHashtable<F> {
51-
class Entry : public BasicHashtableEntry<F> {
52-
public:
53-
uintptr_t _key;
54-
CHeapBitMap* _value;
55-
56-
Entry* next() {
57-
return (Entry*)BasicHashtableEntry<F>::next();
58-
}
59-
};
60-
61-
protected:
62-
Entry* bucket(int i) const;
63-
64-
Entry* new_entry(unsigned int hashValue, uintptr_t key, CHeapBitMap* value);
65-
66-
unsigned hash_segment(uintptr_t key) {
67-
unsigned hash = (unsigned)key;
68-
return hash ^ (hash >> 3);
69-
}
70-
71-
unsigned hash_to_index(unsigned hash) {
72-
return hash & (BasicHashtable<F>::table_size() - 1);
73-
}
74-
75-
public:
76-
BitMapFragmentTable(int table_size) : BasicHashtable<F>(table_size, sizeof(Entry)) {}
77-
~BitMapFragmentTable();
78-
void add(uintptr_t key, CHeapBitMap* value);
79-
CHeapBitMap** lookup(uintptr_t key);
80-
};
50+
static unsigned hash_segment(const uintptr_t& key) {
51+
unsigned hash = (unsigned)key;
52+
return hash ^ (hash >> 3);
53+
}
54+
55+
typedef ResizeableResourceHashtable<uintptr_t, CHeapBitMap*, ResourceObj::C_HEAP, F,
56+
hash_segment> BitMapFragmentTable;
8157

8258
CHeapBitMap* get_fragment_bits(uintptr_t addr);
8359

src/hotspot/share/utilities/objectBitSet.inline.hpp

+6-53
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929

3030
#include "memory/memRegion.hpp"
3131
#include "utilities/bitMap.inline.hpp"
32-
#include "utilities/hashtable.inline.hpp"
3332

3433
template<MEMFLAGS F>
3534
ObjectBitSet<F>::BitMapFragment::BitMapFragment(uintptr_t granule, BitMapFragment* next) :
@@ -39,7 +38,7 @@ ObjectBitSet<F>::BitMapFragment::BitMapFragment(uintptr_t granule, BitMapFragmen
3938

4039
template<MEMFLAGS F>
4140
ObjectBitSet<F>::ObjectBitSet() :
42-
_bitmap_fragments(32),
41+
_bitmap_fragments(32, 8*K),
4342
_fragment_list(NULL),
4443
_last_fragment_bits(NULL),
4544
_last_fragment_granule(UINTPTR_MAX) {
@@ -53,52 +52,8 @@ ObjectBitSet<F>::~ObjectBitSet() {
5352
delete current;
5453
current = next;
5554
}
56-
}
57-
58-
template<MEMFLAGS F>
59-
ObjectBitSet<F>::BitMapFragmentTable::~BitMapFragmentTable() {
60-
for (int index = 0; index < BasicHashtable<F>::table_size(); index ++) {
61-
Entry* e = bucket(index);
62-
while (e != nullptr) {
63-
Entry* tmp = e;
64-
e = e->next();
65-
BasicHashtable<F>::free_entry(tmp);
66-
}
67-
}
68-
}
69-
70-
template<MEMFLAGS F>
71-
inline typename ObjectBitSet<F>::BitMapFragmentTable::Entry* ObjectBitSet<F>::BitMapFragmentTable::bucket(int i) const {
72-
return (Entry*)BasicHashtable<F>::bucket(i);
73-
}
74-
75-
template<MEMFLAGS F>
76-
inline typename ObjectBitSet<F>::BitMapFragmentTable::Entry*
77-
ObjectBitSet<F>::BitMapFragmentTable::new_entry(unsigned int hash, uintptr_t key, CHeapBitMap* value) {
78-
79-
Entry* entry = (Entry*)BasicHashtable<F>::new_entry(hash);
80-
entry->_key = key;
81-
entry->_value = value;
82-
return entry;
83-
}
84-
85-
template<MEMFLAGS F>
86-
inline void ObjectBitSet<F>::BitMapFragmentTable::add(uintptr_t key, CHeapBitMap* value) {
87-
unsigned hash = hash_segment(key);
88-
Entry* entry = new_entry(hash, key, value);
89-
BasicHashtable<F>::add_entry(hash_to_index(hash), entry);
90-
}
91-
92-
template<MEMFLAGS F>
93-
inline CHeapBitMap** ObjectBitSet<F>::BitMapFragmentTable::lookup(uintptr_t key) {
94-
unsigned hash = hash_segment(key);
95-
int index = hash_to_index(hash);
96-
for (Entry* e = bucket(index); e != NULL; e = e->next()) {
97-
if (e->hash() == hash && e->_key == key) {
98-
return &(e->_value);
99-
}
100-
}
101-
return NULL;
55+
// destructors for ResourceHashtable base deletes nodes, and
56+
// ResizeableResourceHashtableStorage deletes the table.
10257
}
10358

10459
template<MEMFLAGS F>
@@ -114,17 +69,15 @@ inline CHeapBitMap* ObjectBitSet<F>::get_fragment_bits(uintptr_t addr) {
11469
}
11570
CHeapBitMap* bits = NULL;
11671

117-
CHeapBitMap** found = _bitmap_fragments.lookup(granule);
72+
CHeapBitMap** found = _bitmap_fragments.get(granule);
11873
if (found != NULL) {
11974
bits = *found;
12075
} else {
12176
BitMapFragment* fragment = new BitMapFragment(granule, _fragment_list);
12277
bits = fragment->bits();
12378
_fragment_list = fragment;
124-
if (_bitmap_fragments.number_of_entries() * 100 / _bitmap_fragments.table_size() > 25) {
125-
_bitmap_fragments.resize(_bitmap_fragments.table_size() * 2);
126-
}
127-
_bitmap_fragments.add(granule, bits);
79+
_bitmap_fragments.put(granule, bits);
80+
_bitmap_fragments.maybe_grow();
12881
}
12982

13083
_last_fragment_bits = bits;

0 commit comments

Comments
 (0)