On 11/29/2013 3:41 AM, Daniel Fuchs wrote:
Hi,

Here is a new revision that includes Peter's findings.
Thanks again for that Peter!

<http://cr.openjdk.java.net/~dfuchs/webrev_8029281/webrev.01/>


LogManager.java
   L156: make props volatile is good.

I think the reason why LoggerWeakRef.node and parentRef don't need to be volatile because of the synchronized block to check and set disposed flag that ensures that only one thread will be doing the node and parentRef cleanup. I agree that the two lines should be done with synchronized on the LoggerContext.

     node.context.removeLogger(name);
     node.loggerRef = null;  // clear LogNode's weak ref to us

I don't see anything obvious wrong with this patch. Have you considered having the dispose() method simply synchronizes on node.context (probably need to get the LoggerContext when instantiating LoggerWeakRef and break dispose method into two - one for the node and the other for the parentRef)? I'm not proposing to do this in JDK 8 since we are ramping down and get a low risk fix in. It may be something to revisit for jdk 9 to a cleaner version.

Logger.java
The assert this.loggerBundle == NO_RESOURCE_BUNDLE; in the Logger constructors doesn't seem to be needed.

Having an immutable LoggerBundle class is good to ensure the resourceBundleName and resourceBundle are consistent.

L1930: is lb.userBundle and lb.resourceBundleName null when getting to this line? Might be better to rename setupResourceInfo to setResourceBundleName (that creates a LoggerBundle with a null RB). On the other hand, setResourceBundle will instantiate a LoggerBundle with non-null rbname and RB. It wasn't obvious to me what does what.

2137             final String rbName = getResourceBundleName();
2138             if (!SYSTEM_LOGGER_RB_NAME.equals(rbName)
2139                     && 
!SYSTEM_LOGGER_RB_NAME.equals(b.getBaseBundleName())) {
2140                 return LoggerBundle.get(rbName, b);
2141             } else {
2142                 return SYSTEM_BUNDLE;
2143             }

To get to the above line, either lb.userBundle is null or getResourceBundle() isoverridden. L2126 already checks that this logger does not associate with the system rbname. It seems to me that the special case here is when the Logger subclass overrides getResourceBundleName() to returnSYSTEM_LOGGER_RB_NAME or override getResourceBundle to return the "sun.util.logging.resources.logging" RB. I tink that we might just simplify the above and just return LoggerBundle.get(rbName, b) and no need to worry about those overridden case which does no use to such a Logger subclass with unmatched rbname and RB. Same comment applied to L2157-2165.

thanks
Mandy

Reply via email to