src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalMBean.java
author iveresov
Fri, 02 Feb 2018 17:28:17 -0800
changeset 48861 47f19ff9903c
parent 47798 9fe9292f5931
permissions -rw-r--r--
8194819: Update Graal Reviewed-by: kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
     1
/*
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
     2
 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
     4
 *
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
     7
 * published by the Free Software Foundation.
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
     8
 *
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    13
 * accompanied this code).
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    14
 *
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    18
 *
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    21
 * questions.
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    22
 */
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    23
package org.graalvm.compiler.hotspot;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    24
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    25
import java.lang.ref.Reference;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    26
import java.lang.ref.WeakReference;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    27
import java.lang.reflect.Field;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    28
import java.util.ArrayList;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    29
import java.util.Iterator;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    30
import java.util.List;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    31
import java.util.Objects;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    32
import jdk.vm.ci.hotspot.HotSpotCompilationRequest;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    33
import jdk.vm.ci.hotspot.HotSpotResolvedJavaMethod;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    34
import jdk.vm.ci.hotspot.HotSpotResolvedJavaType;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    35
import jdk.vm.ci.hotspot.HotSpotResolvedObjectType;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    36
import jdk.vm.ci.meta.MetaUtil;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    37
import jdk.vm.ci.meta.ResolvedJavaMethod;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    38
import jdk.vm.ci.meta.ResolvedJavaType;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    39
import jdk.vm.ci.runtime.JVMCI;
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46536
diff changeset
    40
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46536
diff changeset
    41
import org.graalvm.compiler.debug.DebugOptions;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    42
import org.graalvm.compiler.options.OptionDescriptor;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    43
import org.graalvm.compiler.options.OptionDescriptors;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    44
import org.graalvm.compiler.options.OptionKey;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    45
import org.graalvm.compiler.options.OptionValues;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    46
import org.graalvm.compiler.options.OptionsParser;
48861
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    47
import org.graalvm.collections.EconomicMap;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    48
import org.graalvm.collections.EconomicSet;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    49
import org.graalvm.collections.Equivalence;
47f19ff9903c 8194819: Update Graal
iveresov
parents: 47798
diff changeset
    50
import org.graalvm.collections.UnmodifiableEconomicMap;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    51
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
    52
public final class HotSpotGraalMBean implements javax.management.DynamicMBean {
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    53
    private static Object mBeanServerField;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    54
    private final HotSpotGraalCompiler compiler;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    55
    private final OptionValues options;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    56
    private final EconomicMap<OptionKey<?>, Object> changes;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    57
    private final EconomicSet<Dump> methodDumps;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    58
    private volatile EconomicSet<Reference<ClassLoader>> loaders;
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
    59
    private javax.management.ObjectName registered;
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
    60
    private OptionValues cachedOptions;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    61
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    62
    private HotSpotGraalMBean(HotSpotGraalCompiler compiler, OptionValues options) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    63
        this.compiler = compiler;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    64
        this.options = options;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    65
        this.changes = EconomicMap.create();
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    66
        this.methodDumps = EconomicSet.create();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    67
        EconomicSet<Reference<ClassLoader>> systemLoaderSet = EconomicSet.create(RefEquivalence.INSTANCE);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    68
        systemLoaderSet.add(new WeakReference<>(ClassLoader.getSystemClassLoader()));
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    69
        this.loaders = systemLoaderSet;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    70
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    71
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    72
    private static boolean isMXServerOn() {
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    73
        if (mBeanServerField == null) {
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    74
            try {
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
    75
                final Field field = java.lang.management.ManagementFactory.class.getDeclaredField("platformMBeanServer");
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    76
                field.setAccessible(true);
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    77
                mBeanServerField = field;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    78
            } catch (Exception ex) {
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
    79
                mBeanServerField = java.lang.management.ManagementFactory.class;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    80
            }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    81
        }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    82
        if (mBeanServerField instanceof Field) {
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    83
            try {
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    84
                return ((Field) mBeanServerField).get(null) != null;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    85
            } catch (Exception ex) {
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    86
                return true;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    87
            }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    88
        } else {
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    89
            return false;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    90
        }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    91
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    92
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    93
    public static HotSpotGraalMBean create(HotSpotGraalCompiler compiler) {
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    94
        OptionValues options = HotSpotGraalOptionValues.HOTSPOT_OPTIONS;
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
    95
        HotSpotGraalMBean mbean = new HotSpotGraalMBean(compiler, options);
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    96
        return mbean;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    97
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
    98
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
    99
    public javax.management.ObjectName ensureRegistered(boolean check) {
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   100
        for (int cnt = 0;; cnt++) {
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   101
            if (registered != null) {
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   102
                return registered;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   103
            }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   104
            if (check && !isMXServerOn()) {
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   105
                return null;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   106
            }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   107
            try {
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   108
                javax.management.MBeanServer mbs = java.lang.management.ManagementFactory.getPlatformMBeanServer();
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   109
                javax.management.ObjectName name = new javax.management.ObjectName("org.graalvm.compiler.hotspot:type=Options" + (cnt == 0 ? "" : cnt));
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   110
                mbs.registerMBean(this, name);
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   111
                registered = name;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   112
                break;
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   113
            } catch (javax.management.MalformedObjectNameException | javax.management.MBeanRegistrationException | javax.management.NotCompliantMBeanException ex) {
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   114
                throw new IllegalStateException(ex);
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   115
            } catch (javax.management.InstanceAlreadyExistsException ex) {
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   116
                continue;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   117
            }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   118
        }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   119
        return registered;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   120
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   121
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   122
    public OptionValues optionsFor(OptionValues initialValues, ResolvedJavaMethod forMethod) {
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   123
        ensureRegistered(true);
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   124
        if (forMethod instanceof HotSpotResolvedJavaMethod) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   125
            HotSpotResolvedObjectType type = ((HotSpotResolvedJavaMethod) forMethod).getDeclaringClass();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   126
            if (type instanceof HotSpotResolvedJavaType) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   127
                Class<?> clazz = ((HotSpotResolvedJavaType) type).mirror();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   128
                Reference<ClassLoader> addNewRef = new WeakReference<>(clazz.getClassLoader());
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   129
                if (!loaders.contains(addNewRef)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   130
                    EconomicSet<Reference<ClassLoader>> newLoaders = EconomicSet.create(RefEquivalence.INSTANCE, loaders);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   131
                    newLoaders.add(addNewRef);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   132
                    this.loaders = newLoaders;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   133
                }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   134
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   135
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   136
        return currentMap(initialValues, forMethod);
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   137
    }
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   138
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   139
    private OptionValues currentMap(OptionValues initialValues, ResolvedJavaMethod method) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   140
        if (changes.isEmpty() && methodDumps.isEmpty()) {
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   141
            return initialValues;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   142
        }
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   143
        OptionValues current = cachedOptions;
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   144
        if (current == null) {
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   145
            current = new OptionValues(initialValues, changes);
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   146
            cachedOptions = current;
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   147
        }
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   148
        if (method != null) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   149
            for (Dump request : methodDumps) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   150
                final String clazzName = method.getDeclaringClass().getName();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   151
                if (method.getName().equals(request.method) && clazzName.equals(request.clazz)) {
46640
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46536
diff changeset
   152
                    current = new OptionValues(current, DebugOptions.Dump, request.filter,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46536
diff changeset
   153
                                    DebugOptions.PrintGraphHost, request.host,
70bdce04c59b 8183991: Update Graal
iveresov
parents: 46536
diff changeset
   154
                                    DebugOptions.PrintBinaryGraphPort, request.port);
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   155
                    break;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   156
                }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   157
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   158
        }
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   159
        return current;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   160
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   161
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   162
    @Override
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   163
    public Object getAttribute(String attribute) {
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   164
        UnmodifiableEconomicMap<OptionKey<?>, Object> map = currentMap(options, null).getMap();
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   165
        for (OptionKey<?> k : map.getKeys()) {
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   166
            if (k.getName().equals(attribute)) {
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   167
                return map.get(k);
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   168
            }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   169
        }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   170
        return null;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   171
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   172
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   173
    @Override
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   174
    public void setAttribute(javax.management.Attribute attribute) throws javax.management.AttributeNotFoundException {
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   175
        javax.management.Attribute newAttr = setImpl(attribute);
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   176
        if (newAttr == null) {
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   177
            throw new javax.management.AttributeNotFoundException();
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   178
        }
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   179
    }
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   180
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   181
    private javax.management.Attribute setImpl(javax.management.Attribute attribute) {
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   182
        cachedOptions = null;
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   183
        for (OptionDescriptor option : allOptionDescriptors()) {
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   184
            if (option.getName().equals(attribute.getName())) {
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   185
                changes.put(option.getOptionKey(), attribute.getValue());
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   186
                return attribute;
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   187
            }
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   188
        }
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   189
        return null;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   190
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   191
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   192
    @Override
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   193
    public javax.management.AttributeList getAttributes(String[] names) {
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   194
        javax.management.AttributeList list = new javax.management.AttributeList();
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   195
        for (String name : names) {
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   196
            Object value = getAttribute(name);
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   197
            if (value != null) {
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   198
                list.add(new javax.management.Attribute(name, value));
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   199
            }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   200
        }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   201
        return list;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   202
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   203
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   204
    @Override
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   205
    public javax.management.AttributeList setAttributes(javax.management.AttributeList attributes) {
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   206
        javax.management.AttributeList setOk = new javax.management.AttributeList();
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   207
        for (javax.management.Attribute attr : attributes.asList()) {
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   208
            javax.management.Attribute newAttr = setImpl(attr);
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   209
            if (newAttr != null) {
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   210
                setOk.add(newAttr);
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   211
            }
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   212
        }
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   213
        return setOk;
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   214
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   215
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   216
    @Override
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   217
    public Object invoke(String actionName, Object[] params, String[] signature) throws javax.management.MBeanException, javax.management.ReflectionException {
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   218
        if ("dumpMethod".equals(actionName)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   219
            try {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   220
                String className = param(params, 0, "className", String.class, null);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   221
                String methodName = param(params, 1, "methodName", String.class, null);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   222
                String filter = param(params, 2, "filter", String.class, ":3");
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   223
                String host = param(params, 3, "host", String.class, "localhost");
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   224
                Number port = param(params, 4, "port", Number.class, 4445);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   225
                dumpMethod(className, methodName, filter, host, port.intValue());
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   226
            } catch (Exception ex) {
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   227
                throw new javax.management.ReflectionException(ex);
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   228
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   229
        }
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   230
        return null;
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   231
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   232
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   233
    private static <T> T param(Object[] arr, int index, String name, Class<T> type, T defaultValue) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   234
        Object value = arr.length > index ? arr[index] : null;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   235
        if (value == null || (value instanceof String && ((String) value).isEmpty())) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   236
            if (defaultValue == null) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   237
                throw new IllegalArgumentException(name + " must be specified");
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   238
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   239
            value = defaultValue;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   240
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   241
        if (type.isInstance(value)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   242
            return type.cast(value);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   243
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   244
        throw new IllegalArgumentException("Expecting " + type.getName() + " for " + name + " but was " + value);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   245
    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   246
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   247
    public void dumpMethod(String className, String methodName, String filter, String host, int port) throws javax.management.MBeanException {
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   248
        String jvmName = MetaUtil.toInternalName(className);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   249
        methodDumps.add(new Dump(host, port, jvmName, methodName, filter));
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   250
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   251
        ClassNotFoundException last = null;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   252
        EconomicSet<Class<?>> found = EconomicSet.create();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   253
        Iterator<Reference<ClassLoader>> it = loaders.iterator();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   254
        while (it.hasNext()) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   255
            Reference<ClassLoader> ref = it.next();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   256
            ClassLoader loader = ref.get();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   257
            if (loader == null) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   258
                it.remove();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   259
                continue;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   260
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   261
            try {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   262
                Class<?> clazz = Class.forName(className, false, loader);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   263
                if (found.add(clazz)) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   264
                    ResolvedJavaType type = JVMCI.getRuntime().getHostJVMCIBackend().getMetaAccess().lookupJavaType(clazz);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   265
                    if (compiler != null) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   266
                        for (ResolvedJavaMethod method : type.getDeclaredMethods()) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   267
                            if (methodName.equals(method.getName()) && method instanceof HotSpotResolvedJavaMethod) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   268
                                HotSpotResolvedJavaMethod hotSpotMethod = (HotSpotResolvedJavaMethod) method;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   269
                                compiler.compileMethod(new HotSpotCompilationRequest(hotSpotMethod, -1, 0L), false);
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   270
                            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   271
                        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   272
                    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   273
                }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   274
            } catch (ClassNotFoundException ex) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   275
                last = ex;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   276
            }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   277
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   278
        if (found.isEmpty()) {
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   279
            throw new javax.management.MBeanException(last, "Cannot find class " + className + " to schedule recompilation");
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   280
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   281
    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   282
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   283
    @Override
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   284
    public javax.management.MBeanInfo getMBeanInfo() {
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   285
        List<javax.management.MBeanAttributeInfo> attrs = new ArrayList<>();
47798
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   286
        for (OptionDescriptor descr : allOptionDescriptors()) {
9fe9292f5931 8190710: Update Graal
dlong
parents: 47216
diff changeset
   287
            attrs.add(new javax.management.MBeanAttributeInfo(descr.getName(), descr.getType().getName(), descr.getHelp(), true, true, false));
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   288
        }
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   289
        javax.management.MBeanOperationInfo[] ops = {
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   290
                        new javax.management.MBeanOperationInfo("dumpMethod", "Enable IGV dumps for provided method", new javax.management.MBeanParameterInfo[]{
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   291
                                        new javax.management.MBeanParameterInfo("className", "java.lang.String", "Class to observe"),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   292
                                        new javax.management.MBeanParameterInfo("methodName", "java.lang.String", "Method to observe"),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   293
                        }, "void", javax.management.MBeanOperationInfo.ACTION),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   294
                        new javax.management.MBeanOperationInfo("dumpMethod", "Enable IGV dumps for provided method", new javax.management.MBeanParameterInfo[]{
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   295
                                        new javax.management.MBeanParameterInfo("className", "java.lang.String", "Class to observe"),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   296
                                        new javax.management.MBeanParameterInfo("methodName", "java.lang.String", "Method to observe"),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   297
                                        new javax.management.MBeanParameterInfo("filter", "java.lang.String", "The parameter for Dump option"),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   298
                        }, "void", javax.management.MBeanOperationInfo.ACTION),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   299
                        new javax.management.MBeanOperationInfo("dumpMethod", "Enable IGV dumps for provided method", new javax.management.MBeanParameterInfo[]{
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   300
                                        new javax.management.MBeanParameterInfo("className", "java.lang.String", "Class to observe"),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   301
                                        new javax.management.MBeanParameterInfo("methodName", "java.lang.String", "Method to observe"),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   302
                                        new javax.management.MBeanParameterInfo("filter", "java.lang.String", "The parameter for Dump option"),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   303
                                        new javax.management.MBeanParameterInfo("host", "java.lang.String", "The host where the IGV tool is running at"),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   304
                                        new javax.management.MBeanParameterInfo("port", "int", "The port where the IGV tool is listening at"),
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   305
                        }, "void", javax.management.MBeanOperationInfo.ACTION)
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   306
        };
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   307
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   308
        return new javax.management.MBeanInfo(
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   309
                        HotSpotGraalMBean.class.getName(),
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   310
                        "Graal",
46807
8b2c620d7092 8186158: Update Graal
iveresov
parents: 46640
diff changeset
   311
                        attrs.toArray(new javax.management.MBeanAttributeInfo[attrs.size()]),
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   312
                        null, ops, null);
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   313
    }
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   314
46509
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   315
    private static Iterable<OptionDescriptor> allOptionDescriptors() {
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   316
        List<OptionDescriptor> arr = new ArrayList<>();
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   317
        for (OptionDescriptors set : OptionsParser.getOptionsLoader()) {
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   318
            for (OptionDescriptor descr : set) {
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   319
                arr.add(descr);
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   320
            }
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   321
        }
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   322
        return arr;
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   323
    }
b32d3928ad6a 8181369: Update Graal
iveresov
parents: 46459
diff changeset
   324
46536
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   325
    private static final class Dump {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   326
        final String host;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   327
        final int port;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   328
        final String clazz;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   329
        final String method;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   330
        final String filter;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   331
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   332
        Dump(String host, int port, String clazz, String method, String filter) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   333
            this.host = host;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   334
            this.port = port;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   335
            this.clazz = clazz;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   336
            this.method = method;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   337
            this.filter = filter;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   338
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   339
    }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   340
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   341
    private static final class RefEquivalence extends Equivalence {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   342
        static final Equivalence INSTANCE = new RefEquivalence();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   343
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   344
        private RefEquivalence() {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   345
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   346
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   347
        @Override
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   348
        public boolean equals(Object a, Object b) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   349
            Reference<?> refA = (Reference<?>) a;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   350
            Reference<?> refB = (Reference<?>) b;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   351
            return Objects.equals(refA.get(), refB.get());
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   352
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   353
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   354
        @Override
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   355
        public int hashCode(Object o) {
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   356
            Reference<?> ref = (Reference<?>) o;
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   357
            Object obj = ref.get();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   358
            return obj == null ? 0 : obj.hashCode();
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   359
        }
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   360
79d8dffda212 8182018: Update Graal
iveresov
parents: 46509
diff changeset
   361
    }
46459
7d4e637d3f21 8180267: Update Graal
kvn
parents:
diff changeset
   362
}