45
46 // This hashtable is implemented as an open hash table with a fixed number of buckets.
47
48 template <MEMFLAGS F> BasicHashtableEntry<F>* BasicHashtable<F>::new_entry_free_list() {
49 BasicHashtableEntry<F>* entry = NULL;
50 if (_free_list != NULL) {
51 entry = _free_list;
52 _free_list = _free_list->next();
53 }
54 return entry;
55 }
56
57 // HashtableEntrys are allocated in blocks to reduce the space overhead.
58 template <MEMFLAGS F> BasicHashtableEntry<F>* BasicHashtable<F>::new_entry(unsigned int hashValue) {
59 BasicHashtableEntry<F>* entry = new_entry_free_list();
60
61 if (entry == NULL) {
62 if (_first_free_entry + _entry_size >= _end_block) {
63 int block_size = MIN2(512, MAX2((int)_table_size / 2, (int)_number_of_entries));
64 int len = _entry_size * block_size;
65 len = 1 << log2_intptr(len); // round down to power of 2
66 assert(len >= _entry_size, "");
67 _first_free_entry = NEW_C_HEAP_ARRAY2(char, len, F, CURRENT_PC);
68 _entry_blocks->append(_first_free_entry);
69 _end_block = _first_free_entry + len;
70 }
71 entry = (BasicHashtableEntry<F>*)_first_free_entry;
72 _first_free_entry += _entry_size;
73 }
74
75 assert(_entry_size % HeapWordSize == 0, "");
76 entry->set_hash(hashValue);
77 return entry;
78 }
79
80
81 template <class T, MEMFLAGS F> HashtableEntry<T, F>* Hashtable<T, F>::new_entry(unsigned int hashValue, T obj) {
82 HashtableEntry<T, F>* entry;
83
84 entry = (HashtableEntry<T, F>*)BasicHashtable<F>::new_entry(hashValue);
85 entry->set_literal(obj);
|
45
46 // This hashtable is implemented as an open hash table with a fixed number of buckets.
47
48 template <MEMFLAGS F> BasicHashtableEntry<F>* BasicHashtable<F>::new_entry_free_list() {
49 BasicHashtableEntry<F>* entry = NULL;
50 if (_free_list != NULL) {
51 entry = _free_list;
52 _free_list = _free_list->next();
53 }
54 return entry;
55 }
56
57 // HashtableEntrys are allocated in blocks to reduce the space overhead.
58 template <MEMFLAGS F> BasicHashtableEntry<F>* BasicHashtable<F>::new_entry(unsigned int hashValue) {
59 BasicHashtableEntry<F>* entry = new_entry_free_list();
60
61 if (entry == NULL) {
62 if (_first_free_entry + _entry_size >= _end_block) {
63 int block_size = MIN2(512, MAX2((int)_table_size / 2, (int)_number_of_entries));
64 int len = _entry_size * block_size;
65 len = 1 << log2_int(len); // round down to power of 2
66 assert(len >= _entry_size, "");
67 _first_free_entry = NEW_C_HEAP_ARRAY2(char, len, F, CURRENT_PC);
68 _entry_blocks->append(_first_free_entry);
69 _end_block = _first_free_entry + len;
70 }
71 entry = (BasicHashtableEntry<F>*)_first_free_entry;
72 _first_free_entry += _entry_size;
73 }
74
75 assert(_entry_size % HeapWordSize == 0, "");
76 entry->set_hash(hashValue);
77 return entry;
78 }
79
80
81 template <class T, MEMFLAGS F> HashtableEntry<T, F>* Hashtable<T, F>::new_entry(unsigned int hashValue, T obj) {
82 HashtableEntry<T, F>* entry;
83
84 entry = (HashtableEntry<T, F>*)BasicHashtable<F>::new_entry(hashValue);
85 entry->set_literal(obj);
|