Skip to content

Commit 22971a0

Browse files
committed
svm: workaround for "JDK-8365807: (fs) Two-arg UnixFileAttributes.getIfExists should not use exception for control flow" [GR-69415]
1 parent 83a1478 commit 22971a0

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
package com.oracle.svm.core.jdk;
26+
27+
import static com.oracle.svm.core.jdk.Helper_sun_nio_fs_UnixNativeDispatcher.init1;
28+
29+
import com.oracle.svm.core.annotate.Substitute;
30+
import com.oracle.svm.core.annotate.TargetClass;
31+
32+
@TargetClass(className = "sun.nio.fs.UnixNativeDispatcher", onlyWith = NonWindowsOS.class)
33+
final class Target_sun_nio_fs_UnixNativeDispatcher {
34+
35+
/**
36+
* Wraps the original native {@code init()} call with a pthread mutex. This is a workaround for
37+
* GR-69415. The assumption is that there is a race condition when multiple isolates call the
38+
* static initializer of {@code UnixNativeDispatcher} and thus the native {@code init} function
39+
* concurrently. All those calls operate on the same global C variables so multiple isolates can
40+
* interfere with each other.
41+
*/
42+
@Substitute
43+
static int init() {
44+
return init1(Target_sun_nio_fs_UnixNativeDispatcher.class);
45+
}
46+
}
47+
48+
final class Helper_sun_nio_fs_UnixNativeDispatcher {
49+
/**
50+
* A C-level thread-safe wrapper for the original
51+
* {@link Target_sun_nio_fs_UnixNativeDispatcher#init()}. Implementation is in
52+
* {@code UnixNativeDispatcher.c}.
53+
*/
54+
static native int init1(Class<?> targetSunNioFsUnixNativeDispatcherClass);
55+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Copyright (c) 2025, 2025, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
26+
#include <jni.h>
27+
#include <pthread.h>
28+
29+
// The original init function
30+
jint JNICALL Java_sun_nio_fs_UnixNativeDispatcher_init(JNIEnv* env, jclass this);
31+
32+
// cached capabilities
33+
static jint capabilities = 0;
34+
35+
// Global/static initialization flag and mutex
36+
static jboolean initialized = JNI_FALSE;
37+
static pthread_mutex_t init_mutex = PTHREAD_MUTEX_INITIALIZER;
38+
39+
JNIEXPORT jint JNICALL Java_com_oracle_svm_core_jdk_Helper_1sun_1nio_1fs_1UnixNativeDispatcher_init1(JNIEnv* env, jclass this, jclass unixNativeDispatcherClass) {
40+
pthread_mutex_lock(&init_mutex);
41+
if (initialized == JNI_FALSE) {
42+
capabilities = Java_sun_nio_fs_UnixNativeDispatcher_init(env, unixNativeDispatcherClass);
43+
// initialization done
44+
initialized = JNI_TRUE;
45+
}
46+
pthread_mutex_unlock(&init_mutex);
47+
return capabilities;
48+
}

0 commit comments

Comments
 (0)