This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new 68ec5edf3e Fix BZ 69559 - Avoid 24 warning when not relevant
68ec5edf3e is described below

commit 68ec5edf3e3ecd2b516f871919e167d7036191f1
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 703b2c1485..923c5250cb 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -275,6 +275,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

Reply via email to