[9] RFR: 8171139: Simplify ResourceBundle.CacheKey and ClassLoader may not be needed
Mandy Chung
mandy.chung at oracle.com
Tue Jan 17 19:58:48 UTC 2017
+1
I’m happy with the new reachabilityFence calls.
Mandy
> On Jan 17, 2017, at 10:23 AM, Naoto Sato <naoto.sato at oracle.com> wrote:
>
> Thanks, Peter & Daniel.
>
> I modified the webrevs accordingly:
>
> http://cr.openjdk.java.net/~naoto/8171139/webrev.06/
> http://cr.openjdk.java.net/~naoto/8171140/webrev.01/
>
> The one for 8171139 is the same as Peter's latest one, and the latter one for 8171140 was modified following that change.
>
> Naoto
>
> On 1/17/17 4:24 AM, Daniel Fuchs wrote:
>> +1
>>
>> With Peter's proposed changes if I'm not mistaken then all methods
>> that operate on the CacheKey (findBundle, findBundleInCache,
>> putBundleInCache, loadBundle, loadBundleFromProvider) are all
>> called from a point originating from within the block now protected
>> by the reachability fences, so there should be no opportunity for the
>> referents of our KeyElementReference to become null while the
>> CacheKey is used.
>>
>> Thanks Peter!
>>
>> -- daniel
>>
>> On 17/01/17 11:53, Peter Levart wrote:
>>> Hi Naoto,
>>>
>>> Sorry for joining late for review. Thanks for taking this on. I think it
>>> is shaping well...
>>>
>>> On 01/14/2017 01:54 AM, Naoto Sato wrote:
>>>>
>>>>
>>>> http://cr.openjdk.java.net/~naoto/8171139/webrev.05/
>>>>
>>>
>>> Tho things...
>>>
>>> 1. As said, the "cloning" of CacheKey has no purpose in the following
>>> section of code (lines 1685...1709):
>>>
>>> CacheKey constKey = new CacheKey(cacheKey);
>>> trace("findBundle: %d %s %s formats: %s%n", index,
>>> candidateLocales, cacheKey, formats);
>>> try {
>>> if (module.isNamed()) {
>>> bundle = loadBundle(cacheKey, formats, control,
>>> module, callerModule);
>>> } else {
>>> bundle = loadBundle(cacheKey, formats, control,
>>> expiredBundle);
>>> }
>>> if (bundle != null) {
>>> if (bundle.parent == null) {
>>> bundle.setParent(parent);
>>> }
>>> bundle.locale = targetLocale;
>>> bundle = putBundleInCache(cacheKey, bundle, control);
>>> return bundle;
>>> }
>>>
>>> // Put NONEXISTENT_BUNDLE in the cache as a mark that
>>> there's no bundle
>>> // instance for the locale.
>>> putBundleInCache(cacheKey, NONEXISTENT_BUNDLE, control);
>>> } finally {
>>> if (constKey.getCause() instanceof
>>> InterruptedException) {
>>> Thread.currentThread().interrupt();
>>> }
>>> }
>>>
>>> The 'constKey' is copied of the 'cacheKey' and is not used anywhere
>>> except in finally block where it is asked for .getCause() which will
>>> always be null since copying of CacheKey never copies the cause...
>>>
>>> 2. We can make sure that CacheKey copy constructor always copies a
>>> CacheKey that has non-cleared moduleRef and callerRef. The original
>>> cacheKey is created in getBundleImpl() from nun-null module and
>>> callerModule. getBundleImpl() then calls down to findModule() with this
>>> cacheKey. If we keep a reference to module and callerModule in
>>> getBundleImpl() alive until the end of this method, we guarantee that
>>> moduleRef and callerRef will not be cleared while using such cacheKey to
>>> construct copies of it.
>>>
>>> Here's those two changes applied to your webrev.05 and also a race in
>>> clearCacheImpl() fixed (as reported by Daniel Fuchs):
>>>
>>> http://cr.openjdk.java.net/~plevart/jdk9-dev/8170772_ResourceBundle.caching/webrev.06/
>>>
>>>
>>>
>>> What do you think?
>>>
>>> Regards, Peter
>>>
>>
More information about the core-libs-dev
mailing list