test/hotspot/gtest/utilities/test_concurrentHashtable.cpp
changeset 53555 606b80182f64
parent 53239 c024fcb88ede
child 55478 ae2e53e379cb
--- a/test/hotspot/gtest/utilities/test_concurrentHashtable.cpp	Mon Jan 14 15:40:22 2019 -0800
+++ b/test/hotspot/gtest/utilities/test_concurrentHashtable.cpp	Tue Jan 29 11:44:36 2019 -0600
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -46,10 +46,6 @@
   static uintx get_hash(const uintptr_t& value, bool* dead_hash) {
     return (uintx)value;
   }
-  static const uintptr_t& notfound() {
-    static uintptr_t notfound = 0;
-    return notfound;
-  }
   static void* allocate_node(size_t size, const uintptr_t& value) {
     return ::malloc(size);
   }
@@ -69,18 +65,6 @@
   }
 };
 
-static void cht_insert(Thread* thr) {
-  uintptr_t val = 0x2;
-  SimpleTestLookup stl(val);
-  SimpleTestTable* cht = new SimpleTestTable();
-  EXPECT_TRUE(cht->insert(thr, stl, val)) << "Insert unique value failed.";
-  EXPECT_EQ(cht->get_copy(thr, stl), val) << "Getting an existing value failed.";
-  EXPECT_TRUE(cht->remove(thr, stl)) << "Removing an existing value failed.";
-  EXPECT_FALSE(cht->remove(thr, stl)) << "Removing an already removed item succeeded.";
-  EXPECT_NE(cht->get_copy(thr, stl), val) << "Getting a removed value succeeded.";
-  delete cht;
-}
-
 struct ValueGet {
   uintptr_t _return;
   ValueGet() : _return(0) {}
@@ -93,22 +77,35 @@
   }
 };
 
-static void cht_get_helper(Thread* thr, SimpleTestTable* cht, uintptr_t val) {
-  {
-    SimpleTestLookup stl(val);
-    ValueGet vg;
-    EXPECT_EQ(cht->get(thr, stl, vg), true) << "Getting an old value failed.";
-    EXPECT_EQ(val, vg.get_value()) << "Getting an old value failed.";
-  }
+static uintptr_t cht_get_copy(SimpleTestTable* cht, Thread* thr, SimpleTestLookup stl) {
+  ValueGet vg;
+  cht->get(thr, stl, vg);
+  return vg.get_value();
+}
+
+static void cht_find(Thread* thr, SimpleTestTable* cht, uintptr_t val) {
+  SimpleTestLookup stl(val);
+  ValueGet vg;
+  EXPECT_EQ(cht->get(thr, stl, vg), true) << "Getting an old value failed.";
+  EXPECT_EQ(val, vg.get_value()) << "Getting an old value failed.";
 }
 
-static void cht_insert_helper(Thread* thr, SimpleTestTable* cht, uintptr_t val) {
-  {
-    SimpleTestLookup stl(val);
-    EXPECT_EQ(cht->insert(thr, stl, val), true) << "Inserting an unique value failed.";
-  }
+static void cht_insert_and_find(Thread* thr, SimpleTestTable* cht, uintptr_t val) {
+  SimpleTestLookup stl(val);
+  EXPECT_EQ(cht->insert(thr, stl, val), true) << "Inserting an unique value failed.";
+  cht_find(thr, cht, val);
+}
 
-  cht_get_helper(thr, cht, val);
+static void cht_insert(Thread* thr) {
+  uintptr_t val = 0x2;
+  SimpleTestLookup stl(val);
+  SimpleTestTable* cht = new SimpleTestTable();
+  EXPECT_TRUE(cht->insert(thr, stl, val)) << "Insert unique value failed.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl), val) << "Getting an existing value failed.";
+  EXPECT_TRUE(cht->remove(thr, stl)) << "Removing an existing value failed.";
+  EXPECT_FALSE(cht->remove(thr, stl)) << "Removing an already removed item succeeded.";
+  EXPECT_NE(cht_get_copy(cht, thr, stl), val) << "Getting a removed value succeeded.";
+  delete cht;
 }
 
 static void cht_get_insert(Thread* thr) {
@@ -118,15 +115,15 @@
 
   {
     SCOPED_TRACE("First");
-    cht_insert_helper(thr, cht, val);
+    cht_insert_and_find(thr, cht, val);
   }
-  EXPECT_EQ(cht->get_copy(thr, stl), val) << "Get an old value failed";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl), val) << "Get an old value failed";
   EXPECT_TRUE(cht->remove(thr, stl)) << "Removing existing value failed.";
-  EXPECT_NE(cht->get_copy(thr, stl), val) << "Got an already removed item.";
+  EXPECT_NE(cht_get_copy(cht, thr, stl), val) << "Got an already removed item.";
 
   {
     SCOPED_TRACE("Second");
-    cht_insert_helper(thr, cht, val);
+    cht_insert_and_find(thr, cht, val);
   }
 
   delete cht;
@@ -145,10 +142,10 @@
                                                      bool verify_expect_get, bool verify_expect_inserted) {
   SimpleTestLookup stl(val);
   if (verify_expect_inserted) {
-    cht_insert_helper(thr, cht, val);
+    cht_insert_and_find(thr, cht, val);
   }
   if (verify_expect_get) {
-    cht_get_helper(thr, cht, val);
+    cht_find(thr, cht, val);
   }
 }
 
@@ -169,17 +166,17 @@
   cht_getinsert_bulkdelete_insert_verified(thr, cht, val2, false, true); // val2 should be inserted
   cht_getinsert_bulkdelete_insert_verified(thr, cht, val3, true, false); // val3 should be present
 
-  EXPECT_EQ(cht->get_copy(thr, stl1), val1) << "Get did not find value.";
-  EXPECT_EQ(cht->get_copy(thr, stl2), val2) << "Get did not find value.";
-  EXPECT_EQ(cht->get_copy(thr, stl3), val3) << "Get did not find value.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl1), val1) << "Get did not find value.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl2), val2) << "Get did not find value.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl3), val3) << "Get did not find value.";
 
   // Removes all odd values.
   cht->bulk_delete(thr, getinsert_bulkdelete_eval, getinsert_bulkdelete_del);
 
-  EXPECT_EQ(cht->get_copy(thr, stl1), (uintptr_t)0) << "Odd value should not exist.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl1), (uintptr_t)0) << "Odd value should not exist.";
   EXPECT_FALSE(cht->remove(thr, stl1)) << "Odd value should not exist.";
-  EXPECT_EQ(cht->get_copy(thr, stl2), val2) << "Even value should not have been removed.";
-  EXPECT_EQ(cht->get_copy(thr, stl3), (uintptr_t)0) << "Add value should not exists.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl2), val2) << "Even value should not have been removed.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl3), (uintptr_t)0) << "Add value should not exists.";
   EXPECT_FALSE(cht->remove(thr, stl3)) << "Odd value should not exists.";
 
   delete cht;
@@ -202,9 +199,9 @@
   cht_getinsert_bulkdelete_insert_verified(thr, cht, val2, false, true); // val2 should be inserted
   cht_getinsert_bulkdelete_insert_verified(thr, cht, val3, true, false); // val3 should be present
 
-  EXPECT_EQ(cht->get_copy(thr, stl1), val1) << "Get did not find value.";
-  EXPECT_EQ(cht->get_copy(thr, stl2), val2) << "Get did not find value.";
-  EXPECT_EQ(cht->get_copy(thr, stl3), val3) << "Get did not find value.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl1), val1) << "Get did not find value.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl2), val2) << "Get did not find value.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl3), val3) << "Get did not find value.";
 
   // Removes all odd values.
   SimpleTestTable::BulkDeleteTask bdt(cht);
@@ -216,10 +213,10 @@
     bdt.done(thr);
   }
 
-  EXPECT_EQ(cht->get_copy(thr, stl1), (uintptr_t)0) << "Odd value should not exist.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl1), (uintptr_t)0) << "Odd value should not exist.";
   EXPECT_FALSE(cht->remove(thr, stl1)) << "Odd value should not exist.";
-  EXPECT_EQ(cht->get_copy(thr, stl2), val2) << "Even value should not have been removed.";
-  EXPECT_EQ(cht->get_copy(thr, stl3), (uintptr_t)0) << "Add value should not exists.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl2), val2) << "Even value should not have been removed.";
+  EXPECT_EQ(cht_get_copy(cht, thr, stl3), (uintptr_t)0) << "Add value should not exists.";
   EXPECT_FALSE(cht->remove(thr, stl3)) << "Odd value should not exists.";
 
   delete cht;
@@ -236,7 +233,7 @@
   }
   // We do remove here to make sure the value-handle 'unlocked' the table when leaving the scope.
   EXPECT_TRUE(cht->remove(thr, stl)) << "Removing a pre-existing value failed.";
-  EXPECT_FALSE(cht->get_copy(thr, stl) == val) << "Got a removed value.";
+  EXPECT_FALSE(cht_get_copy(cht, thr, stl) == val) << "Got a removed value.";
   delete cht;
 }
 
@@ -259,7 +256,7 @@
   EXPECT_TRUE(cht->insert(thr, stl, val)) << "Insert unique value failed.";
   EXPECT_EQ(cht->try_scan(thr, scan), true) << "Scanning an non-growing/shrinking table should work.";
   EXPECT_TRUE(cht->remove(thr, stl)) << "Removing a pre-existing value failed.";
-  EXPECT_FALSE(cht->get_copy(thr, stl) == val) << "Got a removed value.";
+  EXPECT_FALSE(cht_get_copy(cht, thr, stl) == val) << "Got a removed value.";
   delete cht;
 }
 
@@ -292,9 +289,9 @@
   ChtCountScan scan_new;
   EXPECT_TRUE(to_cht->try_scan(thr, scan_new)) << "Scanning table should work.";
   EXPECT_EQ(scan_new._count, (size_t)3) << "All items should be moved";
-  EXPECT_TRUE(to_cht->get_copy(thr, stl1) == val1) << "Getting an inserted value should work.";
-  EXPECT_TRUE(to_cht->get_copy(thr, stl2) == val2) << "Getting an inserted value should work.";
-  EXPECT_TRUE(to_cht->get_copy(thr, stl3) == val3) << "Getting an inserted value should work.";
+  EXPECT_TRUE(cht_get_copy(to_cht, thr, stl1) == val1) << "Getting an inserted value should work.";
+  EXPECT_TRUE(cht_get_copy(to_cht, thr, stl2) == val2) << "Getting an inserted value should work.";
+  EXPECT_TRUE(cht_get_copy(to_cht, thr, stl3) == val3) << "Getting an inserted value should work.";
 }
 
 static void cht_grow(Thread* thr) {
@@ -308,31 +305,31 @@
   EXPECT_TRUE(cht->insert(thr, stl2, val2)) << "Insert unique value failed.";
   EXPECT_TRUE(cht->insert(thr, stl3, val3)) << "Insert unique value failed.";
   EXPECT_FALSE(cht->insert(thr, stl3, val3)) << "Insert duplicate value should have failed.";
-  EXPECT_TRUE(cht->get_copy(thr, stl) == val) << "Getting an inserted value should work.";
-  EXPECT_TRUE(cht->get_copy(thr, stl2) == val2) << "Getting an inserted value should work.";
-  EXPECT_TRUE(cht->get_copy(thr, stl3) == val3) << "Getting an inserted value should work.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl) == val) << "Getting an inserted value should work.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl2) == val2) << "Getting an inserted value should work.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl3) == val3) << "Getting an inserted value should work.";
 
   EXPECT_TRUE(cht->remove(thr, stl2)) << "Removing an inserted value should work.";
 
-  EXPECT_TRUE(cht->get_copy(thr, stl) == val) << "Getting an inserted value should work.";
-  EXPECT_FALSE(cht->get_copy(thr, stl2) == val2) << "Getting a removed value should have failed.";
-  EXPECT_TRUE(cht->get_copy(thr, stl3) == val3) << "Getting an inserted value should work.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl) == val) << "Getting an inserted value should work.";
+  EXPECT_FALSE(cht_get_copy(cht, thr, stl2) == val2) << "Getting a removed value should have failed.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl3) == val3) << "Getting an inserted value should work.";
 
 
   EXPECT_TRUE(cht->grow(thr)) << "Growing uncontended should not fail.";
 
-  EXPECT_TRUE(cht->get_copy(thr, stl) == val) << "Getting an item after grow failed.";
-  EXPECT_FALSE(cht->get_copy(thr, stl2) == val2) << "Getting a removed value after grow should have failed.";
-  EXPECT_TRUE(cht->get_copy(thr, stl3) == val3) << "Getting an item after grow failed.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl) == val) << "Getting an item after grow failed.";
+  EXPECT_FALSE(cht_get_copy(cht, thr, stl2) == val2) << "Getting a removed value after grow should have failed.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl3) == val3) << "Getting an item after grow failed.";
 
   EXPECT_TRUE(cht->insert(thr, stl2, val2)) << "Insert unique value failed.";
   EXPECT_TRUE(cht->remove(thr, stl3)) << "Removing an inserted value should work.";
 
   EXPECT_TRUE(cht->shrink(thr)) << "Shrinking uncontended should not fail.";
 
-  EXPECT_TRUE(cht->get_copy(thr, stl) == val) << "Getting an item after shrink failed.";
-  EXPECT_TRUE(cht->get_copy(thr, stl2) == val2) << "Getting an item after shrink failed.";
-  EXPECT_FALSE(cht->get_copy(thr, stl3) == val3) << "Getting a removed value after shrink should have failed.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl) == val) << "Getting an item after shrink failed.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl2) == val2) << "Getting an item after shrink failed.";
+  EXPECT_FALSE(cht_get_copy(cht, thr, stl3) == val3) << "Getting a removed value after shrink should have failed.";
 
   delete cht;
 }
@@ -348,33 +345,33 @@
   EXPECT_TRUE(cht->insert(thr, stl2, val2)) << "Insert unique value failed.";
   EXPECT_TRUE(cht->insert(thr, stl3, val3)) << "Insert unique value failed.";
   EXPECT_FALSE(cht->insert(thr, stl3, val3)) << "Insert duplicate value should have failed.";
-  EXPECT_TRUE(cht->get_copy(thr, stl) == val) << "Getting an inserted value should work.";
-  EXPECT_TRUE(cht->get_copy(thr, stl2) == val2) << "Getting an inserted value should work.";
-  EXPECT_TRUE(cht->get_copy(thr, stl3) == val3) << "Getting an inserted value should work.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl) == val) << "Getting an inserted value should work.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl2) == val2) << "Getting an inserted value should work.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl3) == val3) << "Getting an inserted value should work.";
 
   EXPECT_TRUE(cht->remove(thr, stl2)) << "Removing an inserted value should work.";
 
-  EXPECT_TRUE(cht->get_copy(thr, stl) == val) << "Getting an inserted value should work.";
-  EXPECT_FALSE(cht->get_copy(thr, stl2) == val2) << "Getting a removed value should have failed.";
-  EXPECT_TRUE(cht->get_copy(thr, stl3) == val3) << "Getting an inserted value should work.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl) == val) << "Getting an inserted value should work.";
+  EXPECT_FALSE(cht_get_copy(cht, thr, stl2) == val2) << "Getting a removed value should have failed.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl3) == val3) << "Getting an inserted value should work.";
 
   SimpleTestTable::GrowTask gt(cht);
   EXPECT_TRUE(gt.prepare(thr)) << "Growing uncontended should not fail.";
   while(gt.do_task(thr)) { /* grow */  }
   gt.done(thr);
 
-  EXPECT_TRUE(cht->get_copy(thr, stl) == val) << "Getting an item after grow failed.";
-  EXPECT_FALSE(cht->get_copy(thr, stl2) == val2) << "Getting a removed value after grow should have failed.";
-  EXPECT_TRUE(cht->get_copy(thr, stl3) == val3) << "Getting an item after grow failed.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl) == val) << "Getting an item after grow failed.";
+  EXPECT_FALSE(cht_get_copy(cht, thr, stl2) == val2) << "Getting a removed value after grow should have failed.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl3) == val3) << "Getting an item after grow failed.";
 
   EXPECT_TRUE(cht->insert(thr, stl2, val2)) << "Insert unique value failed.";
   EXPECT_TRUE(cht->remove(thr, stl3)) << "Removing an inserted value should work.";
 
   EXPECT_TRUE(cht->shrink(thr)) << "Shrinking uncontended should not fail.";
 
-  EXPECT_TRUE(cht->get_copy(thr, stl) == val) << "Getting an item after shrink failed.";
-  EXPECT_TRUE(cht->get_copy(thr, stl2) == val2) << "Getting an item after shrink failed.";
-  EXPECT_FALSE(cht->get_copy(thr, stl3) == val3) << "Getting a removed value after shrink should have failed.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl) == val) << "Getting an item after shrink failed.";
+  EXPECT_TRUE(cht_get_copy(cht, thr, stl2) == val2) << "Getting an item after shrink failed.";
+  EXPECT_FALSE(cht_get_copy(cht, thr, stl3) == val3) << "Getting a removed value after shrink should have failed.";
 
   delete cht;
 }
@@ -427,10 +424,6 @@
   static uintx get_hash(const uintptr_t& value, bool* dead_hash) {
     return (uintx)(value + 18446744073709551557ul) * 18446744073709551557ul;
   }
-  static const uintptr_t& notfound() {
-    static uintptr_t notfound = 0;
-    return notfound;
-  }
 };
 
 struct TestLookup {
@@ -444,6 +437,12 @@
   }
 };
 
+static uintptr_t cht_get_copy(TestTable* cht, Thread* thr, TestLookup tl) {
+  ValueGet vg;
+  cht->get(thr, tl, vg);
+  return vg.get_value();
+}
+
 class CHTTestThread : public JavaTestThread {
   public:
   uintptr_t _start;
@@ -530,7 +529,7 @@
     }
     for (uintptr_t v = _start; v <= _stop; v++) {
       TestLookup tl(v);
-      EXPECT_TRUE(_cht->get_copy(this, tl) == v) << "Getting an previously inserted value unsafe failed.";
+      EXPECT_TRUE(cht_get_copy(_cht, this, tl) == v) << "Getting an previously inserted value unsafe failed.";
     }
     for (uintptr_t v = _start; v <= _stop; v++) {
       TestLookup tl(v);
@@ -538,7 +537,7 @@
     }
     for (uintptr_t v = _start; v <= _stop; v++) {
       TestLookup tl(v);
-      EXPECT_TRUE(_cht->get_copy(this, tl) == TestInterface::notfound()) << "Got a removed value.";
+      EXPECT_TRUE(cht_get_copy(_cht, this, tl) == 0) << "Got a removed value.";
     }
     return true;
   }
@@ -577,7 +576,7 @@
   bool test_loop() {
     for (uintptr_t v = 0x500; v < 0x5FF; v++ ) {
       TestLookup tl(v);
-      EXPECT_TRUE(_cht->get_copy(this, tl) == v) << "Getting an previously inserted value unsafe failed.";;
+      EXPECT_TRUE(cht_get_copy(_cht, this, tl) == v) << "Getting an previously inserted value unsafe failed.";;
     }
     return true;
   }
@@ -656,7 +655,7 @@
       uintptr_t tv;
       if (v & 0x1) {
         TestLookup tl(v);
-        tv = _cht->get_copy(this, tl);
+        tv = cht_get_copy(_cht, this, tl);
       } else {
         TestLookup tl(v);
         TestGetHandle value_handle(this, _cht);
@@ -712,7 +711,7 @@
     }
     for (uintptr_t v = _start; v <= _stop; v++) {
       TestLookup tl(v);
-      EXPECT_TRUE(_cht->get_copy(this, tl) == v) <<  "Getting an previously inserted value unsafe failed.";
+      EXPECT_TRUE(cht_get_copy(_cht, this, tl) == v) <<  "Getting an previously inserted value unsafe failed.";
     }
     for (uintptr_t v = _start; v <= _stop; v++) {
       TestLookup tl(v);
@@ -723,7 +722,7 @@
     }
     for (uintptr_t v = _start; v <= _stop; v++) {
       TestLookup tl(v);
-      EXPECT_FALSE(_cht->get_copy(this, tl) == v)  << "Getting a removed value should have failed.";
+      EXPECT_FALSE(cht_get_copy(_cht, this, tl) == v)  << "Getting a removed value should have failed.";
     }
     if (!_shrink && _cht->get_size_log2(this) == END_SIZE) {
       _shrink = true;
@@ -794,7 +793,7 @@
   bool test_loop() {
     for (uintptr_t v = _start; v <= (_start + _range); v++ ) {
       TestLookup tl(v);
-      EXPECT_TRUE(_cht->get_copy(this, tl) == v) <<  "Getting an previously inserted value unsafe failed.";
+      EXPECT_TRUE(cht_get_copy(_cht, this, tl) == v) <<  "Getting an previously inserted value unsafe failed.";
     }
     return true;
   }
@@ -930,9 +929,9 @@
     for (uintptr_t v = _start; v <= (_start + _range); v++ ) {
       TestLookup tl(v);
       if (v & 0xF) {
-        _cht->get_copy(this, tl);
+        cht_get_copy(_cht, this, tl);
       } else {
-        EXPECT_EQ(_cht->get_copy(this, tl), v) << "Item ending with 0xX0 should never be removed.";
+        EXPECT_EQ(cht_get_copy(_cht, this, tl), v) << "Item ending with 0xX0 should never be removed.";
       }
     }
     return true;
@@ -1009,7 +1008,7 @@
 
     for (uintptr_t v = 1; v < 99999; v++ ) {
       TestLookup tl(v);
-      cht->get_copy(this, tl);
+      cht_get_copy(cht, this, tl);
     }
 
     for (int i = 0; i < 4; i++) {