src/jdk.jfr/share/classes/jdk/jfr/internal/SecuritySupport.java
author mgronlun
Wed, 30 Oct 2019 19:43:52 +0100
changeset 58863 c16ac7a2eba4
parent 58240 046533575954
permissions -rw-r--r--
8226511: Implement JFR Event Streaming Reviewed-by: egahlin, mseledtsov, mgronlun Contributed-by: erik.gahlin@oracle.com, mikhailo.seledtsov@oracle.com, markus.gronlund@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
     2
 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
package jdk.jfr.internal;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.io.File;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
import java.io.FileNotFoundException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
import java.io.IOException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
import java.io.InputStream;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import java.io.RandomAccessFile;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
import java.io.Reader;
52015
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
    34
import java.lang.invoke.MethodHandles;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
import java.lang.reflect.Constructor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
import java.lang.reflect.Field;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
import java.lang.reflect.Method;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
import java.lang.reflect.ReflectPermission;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
import java.nio.channels.FileChannel;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
import java.nio.channels.ReadableByteChannel;
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
    41
import java.nio.file.DirectoryStream;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
import java.nio.file.FileVisitResult;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
import java.nio.file.Files;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
import java.nio.file.Path;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
import java.nio.file.Paths;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
import java.nio.file.SimpleFileVisitor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
import java.nio.file.StandardOpenOption;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
import java.nio.file.attribute.BasicFileAttributes;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
import java.security.AccessControlContext;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
import java.security.AccessController;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
import java.security.Permission;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
import java.security.PrivilegedAction;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
import java.security.PrivilegedActionException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
import java.security.PrivilegedExceptionAction;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
import java.util.ArrayList;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    56
import java.util.Iterator;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
import java.util.List;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
import java.util.Objects;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    59
import java.util.PropertyPermission;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
import java.util.concurrent.Callable;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
import jdk.internal.misc.Unsafe;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
import jdk.internal.module.Modules;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
import jdk.jfr.Event;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
import jdk.jfr.FlightRecorder;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
import jdk.jfr.FlightRecorderListener;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
import jdk.jfr.FlightRecorderPermission;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
import jdk.jfr.Recording;
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
    69
import jdk.jfr.internal.consumer.FileAccess;
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
/**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
 * Contains JFR code that does
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
 * {@link AccessController#doPrivileged(PrivilegedAction)}
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
public final class SecuritySupport {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
    private final static Unsafe unsafe = Unsafe.getUnsafe();
52015
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
    77
    private final static MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
    private final static Module JFR_MODULE = Event.class.getModule();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
    public  final static SafePath JFC_DIRECTORY = getPathInProperty("java.home", "lib/jfr");
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
    80
    public final static FileAccess PRIVILIGED = new Privileged();
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
    static final SafePath USER_HOME = getPathInProperty("user.home", null);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
    static final SafePath JAVA_IO_TMPDIR = getPathInProperty("java.io.tmpdir", null);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
52698
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    84
    static {
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    85
        // ensure module java.base can read module jdk.jfr as early as possible
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    86
        addReadEdge(Object.class);
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    87
        addHandlerExport(Object.class);
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    88
        addEventsExport(Object.class);
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    89
        addInstrumentExport(Object.class);
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    90
    }
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
    91
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
    final static class SecureRecorderListener implements FlightRecorderListener {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
        private final AccessControlContext context;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
        private final FlightRecorderListener changeListener;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
        SecureRecorderListener(AccessControlContext context, FlightRecorderListener changeListener) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
            this.context = Objects.requireNonNull(context);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
            this.changeListener = Objects.requireNonNull(changeListener);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
        public void recordingStateChanged(Recording recording) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
            AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
                try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
                    changeListener.recordingStateChanged(recording);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
                } catch (Throwable t) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
                    // Prevent malicious user to propagate exception callback in the wrong context
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
                    Logger.log(LogTag.JFR, LogLevel.WARN, "Unexpected exception in listener " + changeListener.getClass()+ " at recording state change");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
            }, context);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
        public void recorderInitialized(FlightRecorder recorder) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
            AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
                try  {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
                    changeListener.recorderInitialized(recorder);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
                } catch (Throwable t) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
                    // Prevent malicious user to propagate exception callback in the wrong context
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
                    Logger.log(LogTag.JFR, LogLevel.WARN, "Unexpected exception in listener " + changeListener.getClass()+ " when initializing FlightRecorder");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
            }, context);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
        public FlightRecorderListener getChangeListener() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
            return changeListener;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
    private static final class DirectoryCleaner extends SimpleFileVisitor<Path> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
        public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
            Files.delete(path);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
            return FileVisitResult.CONTINUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
        @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
            if (exc != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
                throw exc;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
            Files.delete(dir);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
            return FileVisitResult.CONTINUE;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
     * Path created by the default file provider,and not
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
     * a malicious provider.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
     *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
     */
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   155
    public static final class SafePath implements Comparable<SafePath> {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
        private final Path path;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
        private final String text;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
        public SafePath(Path p) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
            // sanitize
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
            text = p.toString();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
            path = Paths.get(text);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
        public SafePath(String path) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
            this(Paths.get(path));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
        public Path toPath() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
            return path;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   173
        public File toFile() {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   174
            return path.toFile();
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   175
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   176
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
        public String toString() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
            return text;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
        }
58240
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   180
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   181
        @Override
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   182
        public int compareTo(SafePath that) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   183
            return that.text.compareTo(this.text);
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   184
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   185
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   186
        @Override
58240
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   187
        public boolean equals(Object other) {
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   188
            if(other != null && other instanceof SafePath){
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   189
                return this.toPath().equals(((SafePath) other).toPath());
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   190
            }
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   191
            return false;
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   192
        }
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   193
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   194
        @Override
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   195
        public int hashCode() {
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   196
            return this.toPath().hashCode();
046533575954 8216565: Specifying the same path creates a new directory in JFR.configure
cito
parents: 52698
diff changeset
   197
        }
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
    private interface RunnableWithCheckedException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
        public void run() throws Exception;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
    private interface CallableWithoutCheckException<T> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
        public T call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
    private static <U> U doPrivilegedIOWithReturn(Callable<U> function) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
            return AccessController.doPrivileged(new PrivilegedExceptionAction<U>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
                @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
                public U run() throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
                    return function.call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
            }, null);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
        } catch (PrivilegedActionException e) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
            Throwable t = e.getCause();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
            if (t instanceof IOException) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
                throw (IOException) t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
            throw new IOException("Unexpected error during I/O operation. " + t.getMessage(), t);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
    private static void doPriviligedIO(RunnableWithCheckedException function) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
        doPrivilegedIOWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
            function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
            return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
        });
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
    private static void doPrivileged(Runnable function, Permission... perms) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
        AccessController.doPrivileged(new PrivilegedAction<Void>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
            public Void run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
                function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
        }, null, perms);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
    private static void doPrivileged(Runnable function) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
        AccessController.doPrivileged(new PrivilegedAction<Void>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
            public Void run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
                function.run();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
        });
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
    private static <T> T doPrivilegedWithReturn(CallableWithoutCheckException<T> function, Permission... perms) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
        return AccessController.doPrivileged(new PrivilegedAction<T>() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
            public T run() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
                return function.call();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
        }, null, perms);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
    public static List<SafePath> getPredefinedJFCFiles() {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
        List<SafePath> list = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
        try {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
            Iterator<Path> pathIterator = doPrivilegedIOWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
                return Files.newDirectoryStream(JFC_DIRECTORY.toPath(), "*").iterator();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
            });
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
            while (pathIterator.hasNext()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
                Path path = pathIterator.next();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
                if (path.toString().endsWith(".jfc")) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
                    list.add(new SafePath(path));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
                }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
        } catch (IOException ioe) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
            Logger.log(LogTag.JFR, LogLevel.WARN, "Could not access .jfc-files in " + JFC_DIRECTORY + ", " + ioe.getMessage());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
        return list;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
    static void makeVisibleToJFR(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
        Module classModule = clazz.getModule();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
        Modules.addReads(JFR_MODULE, classModule);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
        if (clazz.getPackage() != null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
            String packageName = clazz.getPackage().getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
            Modules.addExports(classModule, packageName, JFR_MODULE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
            Modules.addOpens(classModule, packageName, JFR_MODULE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
    /**
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   290
     * Adds a qualified export of the internal.jdk.jfr.internal.handlers package
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   291
     * (for EventHandler)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   292
     */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   293
    static void addHandlerExport(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   294
        Modules.addExports(JFR_MODULE, Utils.HANDLERS_PACKAGE_NAME, clazz.getModule());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   295
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   296
52698
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   297
    static void addEventsExport(Class<?> clazz) {
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   298
        Modules.addExports(JFR_MODULE, Utils.EVENTS_PACKAGE_NAME, clazz.getModule());
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   299
    }
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   300
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   301
    static void addInstrumentExport(Class<?> clazz) {
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   302
        Modules.addExports(JFR_MODULE, Utils.INSTRUMENT_PACKAGE_NAME, clazz.getModule());
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   303
    }
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   304
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   305
    static void addReadEdge(Class<?> clazz) {
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   306
        Modules.addReads(clazz.getModule(), JFR_MODULE);
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   307
    }
ca6b58b8ffc5 8214287: SpecJbb2005StressModule got uncaught exception
mgronlun
parents: 52334
diff changeset
   308
52334
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   309
    public static void registerEvent(Class<? extends jdk.internal.event.Event> eventClass) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   310
        doPrivileged(() ->  MetadataRepository.getInstance().register(eventClass), new FlightRecorderPermission(Utils.REGISTER_EVENT));
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   311
    }
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   312
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   313
    public static void registerMirror(Class<? extends Event> eventClass) {
a181612f0715 8203629: Produce events in the JDK without a dependency on jdk.jfr
egahlin
parents: 52015
diff changeset
   314
        doPrivileged(() ->  MetadataRepository.getInstance().registerMirror(eventClass), new FlightRecorderPermission(Utils.REGISTER_EVENT));
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   315
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   316
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   317
    public static void setProperty(String propertyName, String value) {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   318
        doPrivileged(() -> System.setProperty(propertyName, value), new PropertyPermission(propertyName, "write"));
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   319
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   320
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   321
    static boolean getBooleanProperty(String propertyName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   322
        return doPrivilegedWithReturn(() -> Boolean.getBoolean(propertyName), new PropertyPermission(propertyName, "read"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   323
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   324
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   325
    private static SafePath getPathInProperty(String prop, String subPath) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   326
        return doPrivilegedWithReturn(() -> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   327
            String path = System.getProperty(prop);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   328
            if (path == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   329
                return null;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   330
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   331
            File file = subPath == null ? new File(path) : new File(path, subPath);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   332
            return new SafePath(file.getAbsolutePath());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   333
        }, new PropertyPermission("*", "read"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   334
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   335
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   336
    // Called by JVM during initialization of JFR
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   337
    static Thread createRecorderThread(ThreadGroup systemThreadGroup, ClassLoader contextClassLoader) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   338
        // The thread should have permission = new Permission[0], and not "modifyThreadGroup" and "modifyThread" on the stack,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   339
        // but it's hard circumvent if we are going to pass in system thread group in the constructor
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   340
        Thread thread = doPrivilegedWithReturn(() -> new Thread(systemThreadGroup, "JFR Recorder Thread"), new RuntimePermission("modifyThreadGroup"), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   341
        doPrivileged(() -> thread.setContextClassLoader(contextClassLoader), new RuntimePermission("setContextClassLoader"), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   342
        return thread;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   343
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   344
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   345
    static void registerShutdownHook(Thread shutdownHook) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   346
        doPrivileged(() -> Runtime.getRuntime().addShutdownHook(shutdownHook), new RuntimePermission("shutdownHooks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   347
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   348
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   349
    static void setUncaughtExceptionHandler(Thread thread, Thread.UncaughtExceptionHandler eh) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   350
        doPrivileged(() -> thread.setUncaughtExceptionHandler(eh), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   351
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   352
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   353
    static void moveReplace(SafePath from, SafePath to) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   354
        doPrivilegedIOWithReturn(() -> Files.move(from.toPath(), to.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   355
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   356
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   357
    static void clearDirectory(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   358
        doPriviligedIO(() -> Files.walkFileTree(safePath.toPath(), new DirectoryCleaner()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   359
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   360
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   361
    static SafePath toRealPath(SafePath safePath) throws IOException {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   362
        return new SafePath(doPrivilegedIOWithReturn(() -> safePath.toPath().toRealPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   363
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   364
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   365
    static boolean existDirectory(SafePath directory) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   366
        return doPrivilegedIOWithReturn(() -> Files.exists(directory.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   367
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   368
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   369
    static RandomAccessFile createRandomAccessFile(SafePath path) throws Exception {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   370
        return doPrivilegedIOWithReturn(() -> new RandomAccessFile(path.toPath().toFile(), "rw"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   371
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   372
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   373
    public static InputStream newFileInputStream(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   374
        return doPrivilegedIOWithReturn(() -> Files.newInputStream(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   375
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   376
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   377
    public static long getFileSize(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   378
        return doPrivilegedIOWithReturn(() -> Files.size(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   379
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   380
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   381
    static SafePath createDirectories(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   382
        Path p = doPrivilegedIOWithReturn(() -> Files.createDirectories(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   383
        return new SafePath(p);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   384
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   385
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   386
    public static boolean exists(SafePath safePath) throws IOException {
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   387
        // Files.exist(path) is allocation intensive
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   388
        return doPrivilegedIOWithReturn(() -> safePath.toPath().toFile().exists());
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   389
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   390
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   391
    public static boolean isDirectory(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   392
        return doPrivilegedIOWithReturn(() -> Files.isDirectory(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   393
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   394
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   395
    static void delete(SafePath localPath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   396
        doPriviligedIO(() -> Files.delete(localPath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   397
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   398
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   399
    static boolean isWritable(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   400
        return doPrivilegedIOWithReturn(() -> Files.isWritable(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   401
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   402
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   403
    static void deleteOnExit(SafePath safePath) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   404
        doPrivileged(() -> safePath.toPath().toFile().deleteOnExit());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   405
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   406
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   407
    static ReadableByteChannel newFileChannelToRead(SafePath safePath) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   408
        return doPrivilegedIOWithReturn(() -> FileChannel.open(safePath.toPath(), StandardOpenOption.READ));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   409
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   410
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   411
    public static InputStream getResourceAsStream(String name) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   412
        return doPrivilegedIOWithReturn(() -> SecuritySupport.class.getResourceAsStream(name));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   413
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   414
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   415
    public static Reader newFileReader(SafePath safePath) throws FileNotFoundException, IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   416
        return doPrivilegedIOWithReturn(() -> Files.newBufferedReader(safePath.toPath()));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   417
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   418
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   419
    static void touch(SafePath path) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   420
        doPriviligedIO(() -> new RandomAccessFile(path.toPath().toFile(), "rw").close());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   421
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   422
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   423
    static void setAccessible(Method method) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   424
        doPrivileged(() -> method.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   425
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   426
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   427
    static void setAccessible(Field field) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   428
        doPrivileged(() -> field.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   429
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   430
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   431
    static void setAccessible(Constructor<?> constructor) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   432
        doPrivileged(() -> constructor.setAccessible(true), new ReflectPermission("suppressAccessChecks"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   433
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   434
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   435
    static void ensureClassIsInitialized(Class<?> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   436
        unsafe.ensureClassInitialized(clazz);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   437
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   438
52015
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   439
    static Class<?> defineClass(Class<?> lookupClass, byte[] bytes) {
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   440
        return AccessController.doPrivileged(new PrivilegedAction<Class<?>>() {
52015
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   441
            @Override
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   442
            public Class<?> run() {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   443
                try {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   444
                    return MethodHandles.privateLookupIn(lookupClass, LOOKUP).defineClass(bytes);
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   445
                } catch (IllegalAccessException e) {
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   446
                    throw new InternalError(e);
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   447
                }
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   448
            }
821bfc24d750 8181443: Replace usages of jdk.internal.misc.Unsafe with MethodHandles.Lookup.defineClass
mchung
parents: 50113
diff changeset
   449
        });
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   450
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   451
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   452
    public static Thread createThreadWitNoPermissions(String threadName, Runnable runnable) {
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   453
        return doPrivilegedWithReturn(() -> new Thread(runnable, threadName), new Permission[0]);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   454
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   455
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   456
    static void setDaemonThread(Thread t, boolean daeomn) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   457
      doPrivileged(()-> t.setDaemon(daeomn), new RuntimePermission("modifyThread"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   458
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   459
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   460
    public static SafePath getAbsolutePath(SafePath path) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   461
        return new SafePath(doPrivilegedIOWithReturn((()-> path.toPath().toAbsolutePath())));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   462
    }
58863
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   463
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   464
    private final static class Privileged extends FileAccess {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   465
        @Override
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   466
        public RandomAccessFile openRAF(File f, String mode) throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   467
            return doPrivilegedIOWithReturn( () -> new RandomAccessFile(f, mode));
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   468
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   469
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   470
        @Override
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   471
        public  DirectoryStream<Path> newDirectoryStream(Path directory)  throws IOException  {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   472
            return doPrivilegedIOWithReturn( () -> Files.newDirectoryStream(directory));
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   473
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   474
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   475
        @Override
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   476
        public  String getAbsolutePath(File f) throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   477
            return doPrivilegedIOWithReturn( () -> f.getAbsolutePath());
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   478
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   479
        @Override
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   480
        public long length(File f) throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   481
            return doPrivilegedIOWithReturn( () -> f.length());
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   482
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   483
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   484
        @Override
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   485
        public  long fileSize(Path p) throws IOException {
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   486
            return doPrivilegedIOWithReturn( () -> Files.size(p));
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   487
        }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   488
    }
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   489
c16ac7a2eba4 8226511: Implement JFR Event Streaming
mgronlun
parents: 58240
diff changeset
   490
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   491
}