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

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

commit 9168b4b6bc0c9c7572932bb316f6560d6f332ab9
Author: Carter Kozak <[email protected]>
AuthorDate: Wed May 22 17:01:38 2019 -0400

    Disallow recursive synchronization, share synchronizeEnqueueWhenQueueFull
---
 .../logging/log4j/core/async/AsyncLoggerConfigDisruptor.java  |  4 +---
 .../apache/logging/log4j/core/async/AsyncLoggerDisruptor.java |  4 +---
 .../org/apache/logging/log4j/core/async/DisruptorUtil.java    | 11 +++++++++++
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
index 9d3ef58..4805e8a 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
@@ -386,9 +386,7 @@ public class AsyncLoggerConfigDisruptor extends 
AbstractLifeCycle implements Asy
     }
 
     private boolean synchronizeEnqueueWhenQueueFull() {
-        return queueFullEnqueueSemaphore != null
-                // Background thread must never block
-                && backgroundThreadId != Thread.currentThread().getId();
+        return 
DisruptorUtil.synchronizeEnqueueWhenQueueFull(queueFullEnqueueSemaphore, 
backgroundThreadId);
     }
 
     @Override
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java
index 9d79e88..f23a5cc 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerDisruptor.java
@@ -289,9 +289,7 @@ class AsyncLoggerDisruptor extends AbstractLifeCycle {
     }
 
     private boolean synchronizeEnqueueWhenQueueFull() {
-        return queueFullEnqueueSemaphore != null
-                // Background thread must never block
-                && backgroundThreadId != Thread.currentThread().getId();
+        return 
DisruptorUtil.synchronizeEnqueueWhenQueueFull(queueFullEnqueueSemaphore, 
backgroundThreadId);
     }
 
     private void logWarningOnNpeFromDisruptorPublish(final 
RingBufferLogEventTranslator translator) {
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
index 298faef..0e01145 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
@@ -35,6 +35,7 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.core.util.Constants;
 import org.apache.logging.log4j.core.util.Integers;
 import org.apache.logging.log4j.core.util.Loader;
+import org.apache.logging.log4j.spi.AbstractLogger;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.util.PropertiesUtil;
 
@@ -183,4 +184,14 @@ final class DisruptorUtil {
         }
         return null;
     }
+
+    static boolean synchronizeEnqueueWhenQueueFull(
+            Semaphore queueFullEnqueueSemaphore, // nullable
+            long backgroundThreadId) {
+        return queueFullEnqueueSemaphore != null
+                // Background thread must never block
+                && backgroundThreadId != Thread.currentThread().getId()
+                // Semaphore is not re-entrant, we must avoid attempting to 
acquire it from recursive logging
+                && AbstractLogger.getRecursionDepth() <= 1;
+    }
 }

Reply via email to