8157453: Convert DependencyContext_test to GTest
Reviewed-by: dholmes, rehn, kzhaldyb
--- a/hotspot/src/share/vm/code/dependencyContext.cpp Wed May 11 23:33:24 2016 +0200
+++ b/hotspot/src/share/vm/code/dependencyContext.cpp Fri May 20 16:45:00 2016 +0200
@@ -272,79 +272,3 @@
int nmethodBucket::decrement() {
return Atomic::add(-1, (volatile int *)&_count);
}
-
-/////////////// Unit tests ///////////////
-
-#ifndef PRODUCT
-
-class TestDependencyContext {
- public:
- nmethod* _nmethods[3];
-
- intptr_t _dependency_context;
-
- DependencyContext dependencies() {
- DependencyContext depContext(&_dependency_context);
- return depContext;
- }
-
- TestDependencyContext() : _dependency_context(DependencyContext::EMPTY) {
- CodeCache_lock->lock_without_safepoint_check();
-
- _nmethods[0] = reinterpret_cast<nmethod*>(0x8 * 0);
- _nmethods[1] = reinterpret_cast<nmethod*>(0x8 * 1);
- _nmethods[2] = reinterpret_cast<nmethod*>(0x8 * 2);
-
- dependencies().add_dependent_nmethod(_nmethods[2]);
- dependencies().add_dependent_nmethod(_nmethods[1]);
- dependencies().add_dependent_nmethod(_nmethods[0]);
- }
-
- ~TestDependencyContext() {
- dependencies().wipe();
- CodeCache_lock->unlock();
- }
-
- static void testRemoveDependentNmethod(int id, bool delete_immediately) {
- TestDependencyContext c;
- DependencyContext depContext = c.dependencies();
- assert(!has_stale_entries(depContext), "check");
-
- nmethod* nm = c._nmethods[id];
- depContext.remove_dependent_nmethod(nm, delete_immediately);
-
- if (!delete_immediately) {
- assert(has_stale_entries(depContext), "check");
- assert(depContext.is_dependent_nmethod(nm), "check");
- depContext.expunge_stale_entries();
- }
-
- assert(!has_stale_entries(depContext), "check");
- assert(!depContext.is_dependent_nmethod(nm), "check");
- }
-
- static void testRemoveDependentNmethod() {
- testRemoveDependentNmethod(0, false);
- testRemoveDependentNmethod(1, false);
- testRemoveDependentNmethod(2, false);
-
- testRemoveDependentNmethod(0, true);
- testRemoveDependentNmethod(1, true);
- testRemoveDependentNmethod(2, true);
- }
-
- static void test() {
- testRemoveDependentNmethod();
- }
-
- static bool has_stale_entries(DependencyContext ctx) {
- assert(ctx.has_stale_entries() == ctx.find_stale_entries(), "check");
- return ctx.has_stale_entries();
- }
-};
-
-void TestDependencyContext_test() {
- TestDependencyContext::test();
-}
-
-#endif // PRODUCT
--- a/hotspot/src/share/vm/code/dependencyContext.hpp Wed May 11 23:33:24 2016 +0200
+++ b/hotspot/src/share/vm/code/dependencyContext.hpp Fri May 20 16:45:00 2016 +0200
@@ -29,6 +29,7 @@
#include "oops/oop.hpp"
#include "runtime/handles.hpp"
#include "runtime/perfData.hpp"
+#include "runtime/safepoint.hpp"
class nmethod;
class DepChange;
--- a/hotspot/src/share/vm/utilities/internalVMTests.cpp Wed May 11 23:33:24 2016 +0200
+++ b/hotspot/src/share/vm/utilities/internalVMTests.cpp Fri May 20 16:45:00 2016 +0200
@@ -41,7 +41,6 @@
void InternalVMTests::run() {
tty->print_cr("Running internal VM tests");
- run_unit_test(TestDependencyContext_test);
run_unit_test(test_semaphore);
run_unit_test(TestOS_test);
run_unit_test(TestReservedSpace_test);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/native/code/test_dependencyContext.cpp Fri May 20 16:45:00 2016 +0200
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2016, 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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ *
+ */
+
+#include "precompiled.hpp"
+#include "code/dependencyContext.hpp"
+#include "unittest.hpp"
+
+class TestDependencyContext {
+ public:
+ nmethod* _nmethods[3];
+
+ intptr_t _dependency_context;
+
+ DependencyContext dependencies() {
+ DependencyContext depContext(&_dependency_context);
+ return depContext;
+ }
+
+ TestDependencyContext() : _dependency_context(DependencyContext::EMPTY) {
+ CodeCache_lock->lock_without_safepoint_check();
+
+ _nmethods[0] = reinterpret_cast<nmethod*>(0x8 * 0);
+ _nmethods[1] = reinterpret_cast<nmethod*>(0x8 * 1);
+ _nmethods[2] = reinterpret_cast<nmethod*>(0x8 * 2);
+
+ dependencies().add_dependent_nmethod(_nmethods[2]);
+ dependencies().add_dependent_nmethod(_nmethods[1]);
+ dependencies().add_dependent_nmethod(_nmethods[0]);
+ }
+
+ ~TestDependencyContext() {
+ dependencies().wipe();
+ CodeCache_lock->unlock();
+ }
+
+ static bool has_stale_entries(DependencyContext ctx) {
+ return ctx.has_stale_entries();
+ }
+
+#ifndef PRODUCT
+ static bool find_stale_entries(DependencyContext ctx) {
+ return ctx.find_stale_entries();
+ }
+#endif
+};
+
+static void test_remove_dependent_nmethod(int id, bool delete_immediately) {
+ TestDependencyContext c;
+ DependencyContext depContext = c.dependencies();
+ NOT_PRODUCT(ASSERT_FALSE(TestDependencyContext::find_stale_entries(depContext)));
+ ASSERT_FALSE(TestDependencyContext::has_stale_entries(depContext));
+
+ nmethod* nm = c._nmethods[id];
+ depContext.remove_dependent_nmethod(nm, delete_immediately);
+
+ if (!delete_immediately) {
+ NOT_PRODUCT(ASSERT_TRUE(TestDependencyContext::find_stale_entries(depContext)));
+ ASSERT_TRUE(TestDependencyContext::has_stale_entries(depContext));
+ NOT_PRODUCT(ASSERT_TRUE(depContext.is_dependent_nmethod(nm)));
+ depContext.expunge_stale_entries();
+ }
+
+ NOT_PRODUCT(ASSERT_FALSE(TestDependencyContext::find_stale_entries(depContext)));
+ ASSERT_FALSE(TestDependencyContext::has_stale_entries(depContext));
+ NOT_PRODUCT(ASSERT_FALSE(depContext.is_dependent_nmethod(nm)));
+}
+
+TEST(code, dependency_context) {
+ test_remove_dependent_nmethod(0, false);
+ test_remove_dependent_nmethod(1, false);
+ test_remove_dependent_nmethod(2, false);
+
+ test_remove_dependent_nmethod(0, true);
+ test_remove_dependent_nmethod(1, true);
+ test_remove_dependent_nmethod(2, true);
+}