< prev index next >

src/hotspot/share/utilities/hashtable.cpp

Print this page


  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       _end_block = _first_free_entry + len;
  69     }
  70     entry = (BasicHashtableEntry<F>*)_first_free_entry;
  71     _first_free_entry += _entry_size;
  72   }
  73 
  74   assert(_entry_size % HeapWordSize == 0, "");
  75   entry->set_hash(hashValue);
  76   return entry;
  77 }
  78 
  79 
  80 template <class T, MEMFLAGS F> HashtableEntry<T, F>* Hashtable<T, F>::new_entry(unsigned int hashValue, T obj) {
  81   HashtableEntry<T, F>* entry;
  82 
  83   entry = (HashtableEntry<T, F>*)BasicHashtable<F>::new_entry(hashValue);
  84   entry->set_literal(obj);
  85   return entry;
  86 }
  87 




  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);
  86   return entry;
  87 }
  88 


< prev index next >