diff truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/profiles/LazyProfileLoadingTest.java @ 22501:a63bda98cfdb

Extract profiles into separate package. Add isProfilingEnabled in TruffleRuntime to disable profiling in the default runtime; Add low overhead profiles for primitives; Add LoopConditionProfile; Profile footprint/threadsafety improvements; Make toString implementations more consistent; Greatly enhanced javadoc documentation for profiles; Deprecate old profiles
author Christian Humer <christian.humer@oracle.com>
date Wed, 16 Dec 2015 16:38:13 +0100
parents
children 4ba1aa33fda4
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/profiles/LazyProfileLoadingTest.java	Wed Dec 16 16:38:13 2015 +0100
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2015, 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.
+ */
+package com.oracle.truffle.api.profiles;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URLClassLoader;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.BlockJUnit4ClassRunner;
+import org.junit.runners.model.InitializationError;
+
+import com.oracle.truffle.api.Truffle;
+import com.oracle.truffle.api.profiles.LazyProfileLoadingTest.SeparateClassloaderTestRunner;
+
+@RunWith(SeparateClassloaderTestRunner.class)
+public class LazyProfileLoadingTest {
+
+    @Test
+    public void testLazyLoading() {
+        IntValueProfile.createIdentityProfile();
+        assertDefaultProfile(IntValueProfile.class);
+
+        DoubleValueProfile.createRawIdentityProfile();
+        assertDefaultProfile(DoubleValueProfile.class);
+
+        LongValueProfile.createIdentityProfile();
+        assertDefaultProfile(LongValueProfile.class);
+
+        FloatValueProfile.createRawIdentityProfile();
+        assertDefaultProfile(FloatValueProfile.class);
+
+        ByteValueProfile.createIdentityProfile();
+        assertDefaultProfile(ByteValueProfile.class);
+
+        LoopConditionProfile.createCountingProfile();
+        assertDefaultProfile(LoopConditionProfile.class);
+
+        BranchProfile.create();
+        assertDefaultProfile(BranchProfile.class);
+
+        PrimitiveValueProfile.createEqualityProfile();
+        assertDefaultProfile(PrimitiveValueProfile.class);
+
+        ConditionProfile.createBinaryProfile();
+        assertLoaded(ConditionProfile.class.getName(), "Binary", "Disabled");
+
+        ConditionProfile.createCountingProfile();
+        assertLoaded(ConditionProfile.class.getName(), "Counting", "Disabled");
+
+        ValueProfile.createClassProfile();
+        assertLoaded(ValueProfile.class.getName(), "ExactClass", "Disabled");
+
+        ValueProfile.createIdentityProfile();
+        assertLoaded(ValueProfile.class.getName(), "Identity", "Disabled");
+    }
+
+    private void assertDefaultProfile(Class<?> clazz) {
+        assertLoaded(clazz.getName(), "Enabled", "Disabled");
+    }
+
+    private void assertLoaded(String className, String posInnerClass, String negInnerClass) {
+        String enabledClass = className + "$" + posInnerClass;
+        String disabledClass = className + "$" + negInnerClass;
+        if (Truffle.getRuntime().isProfilingEnabled()) {
+            Assert.assertFalse(isLoaded(disabledClass));
+            Assert.assertTrue(isLoaded(enabledClass));
+        } else {
+            Assert.assertFalse(isLoaded(enabledClass));
+            Assert.assertTrue(isLoaded(disabledClass));
+        }
+    }
+
+    private boolean isLoaded(String className) {
+        ClassLoader classLoader = getClass().getClassLoader();
+        Method m;
+        try {
+            m = ClassLoader.class.getDeclaredMethod("findLoadedClass", String.class);
+            m.setAccessible(true);
+            return m.invoke(classLoader, className) != null;
+        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static class SeparateClassloaderTestRunner extends BlockJUnit4ClassRunner {
+
+        public SeparateClassloaderTestRunner(Class<?> clazz) throws InitializationError {
+            super(getFromTestClassloader(clazz));
+        }
+
+        private static Class<?> getFromTestClassloader(Class<?> clazz) throws InitializationError {
+            try {
+                ClassLoader testClassLoader = new TestClassLoader();
+                return Class.forName(clazz.getName(), true, testClassLoader);
+            } catch (ClassNotFoundException e) {
+                throw new InitializationError(e);
+            }
+        }
+
+        public static class TestClassLoader extends URLClassLoader {
+            public TestClassLoader() {
+                super(((URLClassLoader) getSystemClassLoader()).getURLs());
+            }
+
+            @Override
+            public Class<?> loadClass(String name) throws ClassNotFoundException {
+                if (name.startsWith(Profile.class.getPackage().getName())) {
+                    return super.findClass(name);
+                }
+                return super.loadClass(name);
+            }
+        }
+    }
+
+}