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;