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 <ma...@apache.org> 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: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org