This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 10.1.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/10.1.x by this push:
new aab33c8373 Fix BZ 69559 - Avoid 24 warning when not relevant
aab33c8373 is described below
commit aab33c8373b796e691623d42c6f1ed02d3dbbf68
Author: Mark Thomas <[email protected]>
AuthorDate: Mon Feb 3 15:40:36 2025 +0000
Fix BZ 69559 - Avoid 24 warning when not relevant
Ensure that the Java 24 warning regarding the of
sun.misc.Unsafe::invokeCleaner is only reported by the JRE when the code
will be used.
https://bz.apache.org/bugzilla/show_bug.cgi?id=69559
---
.../apache/tomcat/util/buf/ByteBufferUtils.java | 47 +-------------------
...BufferUtils.java => ByteBufferUtilsUnsafe.java} | 50 +++++-----------------
webapps/docs/changelog.xml | 5 +++
3 files changed, 17 insertions(+), 85 deletions(-)
diff --git a/java/org/apache/tomcat/util/buf/ByteBufferUtils.java
b/java/org/apache/tomcat/util/buf/ByteBufferUtils.java
index 6ae744db2a..3ad2b51864 100644
--- a/java/org/apache/tomcat/util/buf/ByteBufferUtils.java
+++ b/java/org/apache/tomcat/util/buf/ByteBufferUtils.java
@@ -16,44 +16,10 @@
*/
package org.apache.tomcat.util.buf;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.nio.ByteBuffer;
-import org.apache.juli.logging.Log;
-import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.util.res.StringManager;
-
public class ByteBufferUtils {
- private static final StringManager sm =
StringManager.getManager(ByteBufferUtils.class);
- private static final Log log = LogFactory.getLog(ByteBufferUtils.class);
-
- private static final Object unsafe;
- private static final Method invokeCleanerMethod;
-
- static {
- ByteBuffer tempBuffer = ByteBuffer.allocateDirect(0);
- Object unsafeLocal = null;
- Method invokeCleanerMethodLocal = null;
- try {
- Class<?> clazz = Class.forName("sun.misc.Unsafe");
- Field theUnsafe = clazz.getDeclaredField("theUnsafe");
- theUnsafe.setAccessible(true);
- unsafeLocal = theUnsafe.get(null);
- invokeCleanerMethodLocal = clazz.getMethod("invokeCleaner",
ByteBuffer.class);
- invokeCleanerMethodLocal.invoke(unsafeLocal, tempBuffer);
- } catch (IllegalAccessException | IllegalArgumentException |
InvocationTargetException | NoSuchMethodException |
- SecurityException | ClassNotFoundException |
NoSuchFieldException e) {
- log.warn(sm.getString("byteBufferUtils.cleaner"), e);
- unsafeLocal = null;
- invokeCleanerMethodLocal = null;
- }
- unsafe = unsafeLocal;
- invokeCleanerMethod = invokeCleanerMethodLocal;
- }
-
private ByteBufferUtils() {
// Hide the default constructor since this is a utility class.
}
@@ -96,19 +62,10 @@ public class ByteBufferUtils {
/**
* Clean specified direct buffer. This will cause an unavoidable warning
on Java 24 and newer.
+ *
* @param buf the buffer to clean
*/
public static void cleanDirectBuffer(ByteBuffer buf) {
- if (invokeCleanerMethod != null) {
- try {
- invokeCleanerMethod.invoke(unsafe, buf);
- } catch (IllegalAccessException | IllegalArgumentException |
InvocationTargetException |
- SecurityException e) {
- if (log.isDebugEnabled()) {
- log.debug(sm.getString("byteBufferUtils.cleaner"), e);
- }
- }
- }
+ ByteBufferUtilsUnsafe.cleanDirectBuffer(buf);
}
-
}
diff --git a/java/org/apache/tomcat/util/buf/ByteBufferUtils.java
b/java/org/apache/tomcat/util/buf/ByteBufferUtilsUnsafe.java
similarity index 71%
copy from java/org/apache/tomcat/util/buf/ByteBufferUtils.java
copy to java/org/apache/tomcat/util/buf/ByteBufferUtilsUnsafe.java
index 6ae744db2a..61384a726f 100644
--- a/java/org/apache/tomcat/util/buf/ByteBufferUtils.java
+++ b/java/org/apache/tomcat/util/buf/ByteBufferUtilsUnsafe.java
@@ -25,10 +25,14 @@ import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.res.StringManager;
-public class ByteBufferUtils {
+/*
+ * This functionality is in a separate class so it is only loaded if
cleanDirectBuffer() is called. This is because the
+ * use of unsafe triggers an unavoidable warning with Java 24.
+ */
+class ByteBufferUtilsUnsafe {
- private static final StringManager sm =
StringManager.getManager(ByteBufferUtils.class);
- private static final Log log = LogFactory.getLog(ByteBufferUtils.class);
+ private static final StringManager sm =
StringManager.getManager(ByteBufferUtilsUnsafe.class);
+ private static final Log log =
LogFactory.getLog(ByteBufferUtilsUnsafe.class);
private static final Object unsafe;
private static final Method invokeCleanerMethod;
@@ -54,51 +58,17 @@ public class ByteBufferUtils {
invokeCleanerMethod = invokeCleanerMethodLocal;
}
- private ByteBufferUtils() {
+ private ByteBufferUtilsUnsafe() {
// Hide the default constructor since this is a utility class.
}
- /**
- * Expands buffer to the given size unless it is already as big or bigger.
Buffers are assumed to be in 'write to'
- * mode since there would be no need to expand a buffer while it was in
'read from' mode.
- *
- * @param in Buffer to expand
- * @param newSize The size t which the buffer should be expanded
- *
- * @return The expanded buffer with any data from the input buffer copied
in to it or the original buffer if there
- * was no need for expansion
- */
- public static ByteBuffer expand(ByteBuffer in, int newSize) {
- if (in.capacity() >= newSize) {
- return in;
- }
-
- ByteBuffer out;
- boolean direct = false;
- if (in.isDirect()) {
- out = ByteBuffer.allocateDirect(newSize);
- direct = true;
- } else {
- out = ByteBuffer.allocate(newSize);
- }
-
- // Copy data
- in.flip();
- out.put(in);
-
- if (direct) {
- cleanDirectBuffer(in);
- }
-
- return out;
- }
-
/**
* Clean specified direct buffer. This will cause an unavoidable warning
on Java 24 and newer.
+ *
* @param buf the buffer to clean
*/
- public static void cleanDirectBuffer(ByteBuffer buf) {
+ static void cleanDirectBuffer(ByteBuffer buf) {
if (invokeCleanerMethod != null) {
try {
invokeCleanerMethod.invoke(unsafe, buf);
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index a3f08b714c..1a98e45960 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -227,6 +227,11 @@
Improve the performance of repeated calls to <code>getHeader()</code>.
Pull request <pr>813</pr> provided by Adwait Kumar Singh. (markt)
</fix>
+ <fix>
+ <bug>69559</bug>: Ensure that the Java 24 warning regarding the use of
+ <code> sun.misc.Unsafe::invokeCleaner</code> is only reported by the
JRE
+ when the code will be used. (markt)
+ </fix>
</changelog>
</subsection>
<subsection name="Jasper">
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]