Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files
8247995: Avoid use of a mapping function in Permissions.getPermission…
…Collection

Reviewed-by: rriggs
  • Loading branch information
cl4es committed Jun 23, 2020
1 parent 17f2250 commit 8d9826e4d181dd80003b40dbcdc0f35c7faea1c9
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 26 deletions.
@@ -32,7 +32,6 @@
import java.io.ObjectStreamField;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
@@ -230,38 +229,50 @@ public Enumeration<Permission> elements() {
*/
private PermissionCollection getPermissionCollection(Permission p,
boolean createEmpty) {
Class<?> c = p.getClass();

if (!hasUnresolved && !createEmpty) {
return permsMap.get(c);
PermissionCollection pc = permsMap.get(p.getClass());
if ((!hasUnresolved && !createEmpty) || pc != null) {
// Collection not to be created, or already created
return pc;
}
return createPermissionCollection(p, createEmpty);
}

// Create and add permission collection to map if it is absent.
// NOTE: cannot use lambda for mappingFunction parameter until
// JDK-8076596 is fixed.
return permsMap.computeIfAbsent(c,
new java.util.function.Function<>() {
@Override
public PermissionCollection apply(Class<?> k) {
// Check for unresolved permissions
PermissionCollection pc =
(hasUnresolved ? getUnresolvedPermissions(p) : null);
private PermissionCollection createPermissionCollection(Permission p,
boolean createEmpty) {
synchronized (permsMap) {
// Re-read under lock
Class<?> c = p.getClass();
PermissionCollection pc = permsMap.get(c);

// if still null, create a new collection
if (pc == null && createEmpty) {
// Collection already created
if (pc != null) {
return pc;
}

pc = p.newPermissionCollection();
// Create and add permission collection to map if it is absent.
// Check for unresolved permissions
pc = (hasUnresolved ? getUnresolvedPermissions(p) : null);

// still no PermissionCollection?
// We'll give them a PermissionsHash.
if (pc == null) {
pc = new PermissionsHash();
}
}
return pc;
// if still null, create a new collection
if (pc == null && createEmpty) {

pc = p.newPermissionCollection();

// still no PermissionCollection?
// We'll give them a PermissionsHash.
if (pc == null) {
pc = new PermissionsHash();
}
}
if (pc != null) {
// Add pc, resolving any race
PermissionCollection oldPc = permsMap.putIfAbsent(c, pc);
if (oldPc != null) {
pc = oldPc;
}
}
);
return pc;
}
}

/**
@@ -0,0 +1,78 @@
/*
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.openjdk.bench.java.security;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;

import java.security.Permissions;
import java.security.UnresolvedPermission;
import java.util.concurrent.TimeUnit;

/**
* Benchmark measuring Permissions.implies
*/
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 5, time = 1000, timeUnit = TimeUnit.MILLISECONDS)
@Fork(3)
@State(Scope.Thread)
public class PermissionsImplies {

private Permissions withPermission = new Permissions();
private Permissions withoutPermission = new Permissions();
private Permissions withUnresolvedPermission = new Permissions();

private RuntimePermission permission = new RuntimePermission("exitVM");

@Setup
public void setup() {
withPermission.add(permission);
withUnresolvedPermission.add(permission);
withUnresolvedPermission.add(new UnresolvedPermission("java.lang.FilePermission", "foo", "write", null));
}

@Benchmark
public boolean withoutPermission() {
return withoutPermission.implies(permission);
}

@Benchmark
public boolean withPermission() {
return withPermission.implies(permission);
}

@Benchmark
public boolean withUnresolvedPermission() {
return withUnresolvedPermission.implies(permission);
}
}

0 comments on commit 8d9826e

Please sign in to comment.