src/share/vm/utilities/hashtable.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/utilities/hashtable.cpp Fri Feb 21 09:04:02 2014
--- new/src/share/vm/utilities/hashtable.cpp Fri Feb 21 09:04:02 2014
*** 23,32 ****
--- 23,33 ----
*/
#include "precompiled.hpp"
#include "classfile/altHashing.hpp"
#include "classfile/javaClasses.hpp"
+ #include "code/dependencies.hpp"
#include "memory/allocation.inline.hpp"
#include "memory/filemap.hpp"
#include "memory/resourceArea.hpp"
#include "oops/oop.inline.hpp"
#include "runtime/safepoint.hpp"
*** 336,346 ****
--- 337,346 ----
}
#endif // PRODUCT
#ifdef ASSERT
template <MEMFLAGS F> void BasicHashtable<F>::verify_lookup_length(double load) {
if ((double)_lookup_length / (double)_lookup_count > load * 2.0) {
warning("Performance bug: SystemDictionary lookup_count=%d "
*** 349,358 ****
--- 349,410 ----
(double) _lookup_length / _lookup_count, load);
}
}
#endif
+
+
+ template<class T, class M> GenericHashtable<T, M>::GenericHashtable(int size, bool resource_mark, MEMFLAGS memflag) {
+ assert(size > 0, " Invalid hashtable size");
+ _size = size;
+ // Perform subtype-specific resource allocation
+ _elements = (resource_mark) ? NEW_RESOURCE_ARRAY(T*, size) : NEW_C_HEAP_ARRAY(T*, size, memflag);
+ memset(_elements, 0, sizeof(T*) * size);
+ }
+
+
+ /**
+ * Add item to the hashtable. Returns 'true' if an element was added
+ * and false otherwise.
+ */
+ template<class T, class F> bool GenericHashtable<T, F>::add(T* item) {
+ if ((item == NULL) || contains(item)) {
+ return false;
+ }
+
+ uintptr_t hash = item->hash();
+ int idx = hash % size();
+
+ // Add to linked list
+ if (element_at(idx) != NULL) {
+ item->set_next(element_at(idx));
+ }
+
+ set_element_at(item, idx);
+ return true;
+ }
+
+ template<class T, class F> bool GenericHashtable<T, F>::contains(T* element) {
+ if (element == NULL) {
+ return false;
+ }
+
+ uintptr_t hash = element->hash();
+ int idx = hash % size();
+ if (element_at(idx) != NULL) {
+ T* current_element = element_at(idx);
+ while (current_element != NULL) {
+ if (current_element->equals(element)) {
+ return true;
+ }
+ current_element = current_element->next();
+ }
+ }
+ return false;
+ }
+
+
// Explicitly instantiate these types
template class Hashtable<ConstantPool*, mtClass>;
template class Hashtable<Symbol*, mtSymbol>;
template class Hashtable<Klass*, mtClass>;
template class Hashtable<oop, mtClass>;
*** 368,372 ****
--- 420,426 ----
template class BasicHashtableEntry<mtCode>;
template class BasicHashtable<mtClass>;
template class BasicHashtable<mtSymbol>;
template class BasicHashtable<mtCode>;
template class BasicHashtable<mtInternal>;
+
+ template class GenericHashtable<DependencySignature, ResourceObj>;
src/share/vm/utilities/hashtable.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File