You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2022/06/18 23:48:14 UTC

[logging-log4j2] 02/17: Add optional module for existing sun.misc.Unsafe usage

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

mattsicker pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit c85808205d7f90d0dc3d7c2e57e5e50e9328c31b
Author: Matt Sicker <ma...@apache.org>
AuthorDate: Sat Jun 18 16:27:54 2022 -0500

    Add optional module for existing sun.misc.Unsafe usage
    
    Signed-off-by: Matt Sicker <ma...@apache.org>
---
 log4j-core/src/main/java/module-info.java                |  4 ++++
 .../log4j/core/appender/MemoryMappedFileManager.java     | 16 +++++++---------
 2 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/log4j-core/src/main/java/module-info.java b/log4j-core/src/main/java/module-info.java
index 7f0816f4ec..2720f21160 100644
--- a/log4j-core/src/main/java/module-info.java
+++ b/log4j-core/src/main/java/module-info.java
@@ -76,6 +76,10 @@ module org.apache.logging.log4j.core {
     requires static com.fasterxml.jackson.dataformat.yaml;
     requires static org.apache.commons.compress;
     requires static org.fusesource.jansi;
+
+    // sun.misc.Unsafe::invokeCleaner via MemoryMappedFileManager
+    requires static jdk.unsupported;
+
     uses org.apache.logging.log4j.core.util.ContextDataProvider;
     uses org.apache.logging.log4j.core.util.WatchEventService;
     uses org.apache.logging.log4j.core.script.ScriptManagerFactory;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
index 2a7714d433..587ffed469 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
@@ -16,12 +16,17 @@
  */
 package org.apache.logging.log4j.core.appender;
 
+import org.apache.logging.log4j.core.Layout;
+import org.apache.logging.log4j.core.util.Closer;
+import org.apache.logging.log4j.core.util.FileUtils;
+import org.apache.logging.log4j.core.util.NullOutputStream;
+import org.apache.logging.log4j.util.ReflectionUtil;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.RandomAccessFile;
 import java.io.Serializable;
-import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -34,11 +39,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 
-import org.apache.logging.log4j.core.Layout;
-import org.apache.logging.log4j.core.util.Closer;
-import org.apache.logging.log4j.core.util.FileUtils;
-import org.apache.logging.log4j.core.util.NullOutputStream;
-
 //Lines too long...
 //CHECKSTYLE:OFF
 /**
@@ -225,9 +225,7 @@ public class MemoryMappedFileManager extends OutputStreamManager {
         final long startNanos = System.nanoTime();
         AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
             final Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
-            final Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
-            unsafeField.setAccessible(true);
-            final Object unsafe = unsafeField.get(null);
+            final Object unsafe = ReflectionUtil.getStaticFieldValue(unsafeClass.getDeclaredField("theUnsafe"));
             final Method invokeCleaner = unsafeClass.getMethod("invokeCleaner", ByteBuffer.class);
             invokeCleaner.invoke(unsafe, mbb);
             return null;