8069124: runtime/NMT/MallocSiteHashOverflow.java failing in nightlies
authorctornqvi
Tue, 10 Mar 2015 04:53:58 -0700
changeset 29462 f2e2922222a4
parent 29461 3f6358b7c82c
child 29463 4b16497408b9
8069124: runtime/NMT/MallocSiteHashOverflow.java failing in nightlies Reviewed-by: coleenp, gtriantafill, dholmes
hotspot/src/share/vm/services/mallocSiteTable.cpp
hotspot/src/share/vm/services/mallocSiteTable.hpp
hotspot/src/share/vm/utilities/nativeCallStack.cpp
hotspot/src/share/vm/utilities/nativeCallStack.hpp
--- a/hotspot/src/share/vm/services/mallocSiteTable.cpp	Mon Mar 09 13:39:24 2015 -0400
+++ b/hotspot/src/share/vm/services/mallocSiteTable.cpp	Tue Mar 10 04:53:58 2015 -0700
@@ -135,8 +135,7 @@
  */
 MallocSite* MallocSiteTable::lookup_or_add(const NativeCallStack& key, size_t* bucket_idx,
   size_t* pos_idx) {
-  int index = hash_to_index(key.hash());
-  assert(index >= 0, err_msg("Negative index %d", index));
+  unsigned int index = hash_to_index(key.hash());
   *bucket_idx = (size_t)index;
   *pos_idx = 0;
 
--- a/hotspot/src/share/vm/services/mallocSiteTable.hpp	Mon Mar 09 13:39:24 2015 -0400
+++ b/hotspot/src/share/vm/services/mallocSiteTable.hpp	Tue Mar 10 04:53:58 2015 -0700
@@ -238,8 +238,7 @@
   static MallocSite* malloc_site(size_t bucket_idx, size_t pos_idx);
   static bool walk(MallocSiteWalker* walker);
 
-  static inline int hash_to_index(int  hash) {
-    hash = (hash > 0) ? hash : (-hash);
+  static inline unsigned int hash_to_index(unsigned int hash) {
     return (hash % table_size);
   }
 
--- a/hotspot/src/share/vm/utilities/nativeCallStack.cpp	Mon Mar 09 13:39:24 2015 -0400
+++ b/hotspot/src/share/vm/utilities/nativeCallStack.cpp	Tue Mar 10 04:53:58 2015 -0700
@@ -55,6 +55,7 @@
   for (; index < NMT_TrackingStackDepth; index ++) {
     _stack[index] = NULL;
   }
+  _hash_value = 0;
 }
 
 // number of stack frames captured
@@ -69,19 +70,16 @@
 }
 
 // Hash code. Any better algorithm?
-int NativeCallStack::hash() const {
-  long hash_val = _hash_value;
+unsigned int NativeCallStack::hash() const {
+  uintptr_t hash_val = _hash_value;
   if (hash_val == 0) {
-    long pc;
-    int  index;
-    for (index = 0; index < NMT_TrackingStackDepth; index ++) {
-      pc = (long)_stack[index];
-      if (pc == 0) break;
-      hash_val += pc;
+    for (int index = 0; index < NMT_TrackingStackDepth; index++) {
+      if (_stack[index] == NULL) break;
+      hash_val += (uintptr_t)_stack[index];
     }
 
     NativeCallStack* p = const_cast<NativeCallStack*>(this);
-    p->_hash_value = (int)(hash_val & 0xFFFFFFFF);
+    p->_hash_value = (unsigned int)(hash_val & 0xFFFFFFFF);
   }
   return _hash_value;
 }
--- a/hotspot/src/share/vm/utilities/nativeCallStack.hpp	Mon Mar 09 13:39:24 2015 -0400
+++ b/hotspot/src/share/vm/utilities/nativeCallStack.hpp	Tue Mar 10 04:53:58 2015 -0700
@@ -56,8 +56,8 @@
   static const NativeCallStack EMPTY_STACK;
 
  private:
-  address   _stack[NMT_TrackingStackDepth];
-  int       _hash_value;
+  address       _stack[NMT_TrackingStackDepth];
+  unsigned int  _hash_value;
 
  public:
   NativeCallStack(int toSkip = 0, bool fillStack = false);
@@ -89,7 +89,7 @@
   }
 
   // Hash code. Any better algorithm?
-  int hash() const;
+  unsigned int hash() const;
 
   void print_on(outputStream* out) const;
   void print_on(outputStream* out, int indent) const;