mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
8231584: Deadlock with ClassLoader.findLibrary and System.loadLibrary call
Reviewed-by: mchung
This commit is contained in:
parent
725da985e1
commit
4b7bbaf5b0
6 changed files with 243 additions and 9 deletions
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2019, Azul Systems, Inc. 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
|
||||
|
@ -2004,6 +2005,17 @@ public abstract class ClassLoader {
|
|||
return scl;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize default paths for native libraries search.
|
||||
* Must be done early as JDK may load libraries during bootstrap.
|
||||
*
|
||||
* @see java.lang.System#initPhase1
|
||||
*/
|
||||
static void initLibraryPaths() {
|
||||
usr_paths = initializePath("java.library.path");
|
||||
sys_paths = initializePath("sun.boot.library.path");
|
||||
}
|
||||
|
||||
// Returns true if the specified class loader can be found in this class
|
||||
// loader's delegation chain.
|
||||
boolean isAncestor(ClassLoader cl) {
|
||||
|
@ -2473,8 +2485,7 @@ public abstract class ClassLoader {
|
|||
*
|
||||
* We use a static stack to hold the list of libraries we are
|
||||
* loading because this can happen only when called by the
|
||||
* same thread because Runtime.load and Runtime.loadLibrary
|
||||
* are synchronous.
|
||||
* same thread because this block is synchronous.
|
||||
*
|
||||
* If there is a pending load operation for the library, we
|
||||
* immediately return success; otherwise, we raise
|
||||
|
@ -2619,10 +2630,9 @@ public abstract class ClassLoader {
|
|||
boolean isAbsolute) {
|
||||
ClassLoader loader =
|
||||
(fromClass == null) ? null : fromClass.getClassLoader();
|
||||
if (sys_paths == null) {
|
||||
usr_paths = initializePath("java.library.path");
|
||||
sys_paths = initializePath("sun.boot.library.path");
|
||||
}
|
||||
assert sys_paths != null : "should be initialized at this point";
|
||||
assert usr_paths != null : "should be initialized at this point";
|
||||
|
||||
if (isAbsolute) {
|
||||
if (loadLibrary0(fromClass, new File(name))) {
|
||||
return;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue