[jboss-svn-commits] JBoss Common SVN: r3293 - jboss-logmanager/trunk/src/main/java/org/jboss/logmanager.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Jun 19 20:34:13 EDT 2009
Author: david.lloyd at jboss.com
Date: 2009-06-19 20:34:13 -0400 (Fri, 19 Jun 2009)
New Revision: 3293
Modified:
jboss-logmanager/trunk/src/main/java/org/jboss/logmanager/LoggerNode.java
Log:
make logger field volatile (lockfree)
Modified: jboss-logmanager/trunk/src/main/java/org/jboss/logmanager/LoggerNode.java
===================================================================
--- jboss-logmanager/trunk/src/main/java/org/jboss/logmanager/LoggerNode.java 2009-06-18 13:51:07 UTC (rev 3292)
+++ jboss-logmanager/trunk/src/main/java/org/jboss/logmanager/LoggerNode.java 2009-06-20 00:34:13 UTC (rev 3293)
@@ -25,6 +25,7 @@
import java.lang.ref.WeakReference;
import java.util.Collection;
import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import static org.jboss.logmanager.ConcurrentReferenceHashMap.ReferenceType.STRONG;
import static org.jboss.logmanager.ConcurrentReferenceHashMap.ReferenceType.WEAK;
@@ -47,11 +48,16 @@
private final String fullName;
/**
- * A weak reference to the logger instance. Protected by {@code this}.
+ * A weak reference to the logger instance. Only update using {@link #loggerRefUpdater}.
*/
- private LoggerRef loggerRef = null;
+ private volatile LoggerRef loggerRef = null;
/**
+ * The atomic updater for {@link #loggerRef}.
+ */
+ private static final AtomicReferenceFieldUpdater<LoggerNode, LoggerRef> loggerRefUpdater = AtomicReferenceFieldUpdater.newUpdater(LoggerNode.class, LoggerRef.class, "loggerRef");
+
+ /**
* The map of names to child nodes. The child node references are weak.
*/
private final ConcurrentMap<String, LoggerNode> children = new ConcurrentReferenceHashMap<String, LoggerNode>(8, STRONG, WEAK);
@@ -147,14 +153,20 @@
* @return a logger instance
*/
Logger getOrCreateLogger() {
- synchronized(this) {
- Logger instance = loggerRef == null ? null : loggerRef.get();
- if (instance == null) {
- instance = new Logger(this, fullName);
- loggerRef = fullName.length() == 0 ? new StrongLoggerRef(instance) : new WeakLoggerRef(instance);
- instance.setLevel(null);
+ final String fullName = this.fullName;
+ final LoggerNode parent = this.parent;
+ for (;;) {
+ LoggerRef loggerRef = this.loggerRef;
+ if (loggerRef != null) {
+ final Logger logger = loggerRef.get();
+ if (logger != null) {
+ return logger;
+ }
}
- return instance;
+ final Logger logger = new Logger(this, fullName);
+ if (loggerRefUpdater.compareAndSet(this, null, parent == null ? new StrongLoggerRef(logger) : new WeakLoggerRef(logger))) {
+ return logger;
+ }
}
}
@@ -187,7 +199,7 @@
LoggerNode node = parent;
while (node != null) {
synchronized(node) {
- final Logger instance = node.loggerRef == null ? null : node.loggerRef.get();
+ final Logger instance = node.getLogger();
if (instance != null) {
return instance;
}
@@ -217,12 +229,9 @@
for (LoggerNode node : children.values()) {
if (node != null) {
synchronized (node) {
- final LoggerRef loggerRef = node.loggerRef;
- if (loggerRef != null) {
- final Logger instance = loggerRef.get();
- if (instance != null) {
- instance.setEffectiveLevel(newLevel);
- }
+ final Logger instance = node.getLogger();
+ if (instance != null) {
+ instance.setEffectiveLevel(newLevel);
}
}
}
More information about the jboss-svn-commits
mailing list