RFR: 8077846: improve locking strategy for readConfiguration(), reset(), and initializeGlobalHandlers()
peter.levart at gmail.com
Thu Apr 30 11:08:00 UTC 2015
On 04/28/2015 05:46 PM, Peter Levart wrote:
> On 04/28/2015 04:57 PM, Daniel Fuchs wrote:
>>> Here's my attempt at simplifying this:
>> LogManager can be subclassed, and subclasses may override reset() for
>> different purposes.
>> So I'm afraid the Cleaner thread still needs to call te public
>> reset() method. The same unfortunately applies to
>> best regards,
>> -- daniel
> Um, yes of course. This can be fixed:
> Regards, Peter
Just some observations...
I noticed you changed LogManager.Cleaner superclass from
ManagedLocalsThread -> Thread. Is that intentional? The Cleaner is an
unstarted Thread that gets registered as a shutdown hook in LogManager
constructor. So at LogManager construction time it gets hold on
inheritable thread locals and keeps them for the entire JVM lifetime. Do
we have control on what thread performs LogManager construction and that
no inheritable thread-local leaks are possible?
The other thing to note is that Cleaner class is not static, so it has
an implicit reference to LogManager instance. So each LogManager
instance constructed during lifetime of JVM is actually retained for the
entire JVM lifetime.
The use of shutdown hook to call reset() directly is questionable. Why?
Because other shutdown hooks might want to log their shutdown processing
and they will race with LogManager shutdown hook executing reset(),
shutting down all log handlers and effectively preventing shutdown
process form being logged. Why is it so important to reset()
LogManager(s) before exiting VM?
More information about the core-libs-dev