On Tue, 25 Feb 2025 11:35:18 GMT, David Beaumont <d...@openjdk.org> wrote:

>> src/java.logging/share/classes/java/util/logging/Formatter.java line 94:
>> 
>>> 92:      * important to avoid making callbacks to unknown user-provided 
>>> arguments
>>> 93:      * (e.g. log record parameters captured from previous calls to
>>> 94:      * {@link #format(LogRecord)}.
>> 
>> I'm having trouble getting my head around these comments. Are they intended 
>> for callers or for subclassers? Is the "associated" handler the same handler 
>> as the argument, or a different one? I saw the discussion of potential 
>> (largely theoretical?) deadlock in the discussion in 
>> StreamHandler.publish(), but I'm having trouble figuring out what kind of 
>> actual constraint that potential imposes on which code.
>
> The caller of this class is almost always JDK logging code, so these comments 
> are intended for anyone implementing a formatter. The handler is the target 
> handler (well spotted), and I don't believe it's ever actually null in any 
> real code in the JDK.
> 
> The reason that I commented here is because in the PR conversation, it's been 
> noted that formatter is odd because two of its methods are intended to be 
> called without locks held (and for implementations to avoid taking more 
> locks), and two methods are expected to be called with locks held, which 
> means any implementation of them should avoid calling toString() etc.
> 
> Now while getHead() and getTail() aren't given any user arguments to format, 
> it was pointed out that they might have held onto some (e.g. from the last 
> processed log record). And this use case isn't entirely odd, because having a 
> "getTail()" method that emits the last log statement timestamp, or some 
> summary of the number of log statements of certain types has value. This can 
> be done safely if you only capture timestamps and counters, because 
> formatting them won't result in arbitrary user code being invoked, but it's 
> easy to imagine people thinking it's also okay to capture certain logged 
> arguments to processing here (while it would be safe to call toString(), and 
> capture that when the record is processed, it's not safe to call toString() 
> in getHead() or getTail()).
> 
> I felt that since, without guidance, there's a good chance people will assume 
> all the methods in this class are "the same" in terms of locking constraints, 
> something needed to be put in to distinguish the two (incompatible) 
> constraints these methods have.

After discussion, we decided this was too special-case and too tricky to 
explain in a simple JavaDoc note, so I revert these comments for now. We might 
add them back, or (more likely) I'll write a "how to write handlers and 
formatters" guide in some format tbd.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/23491#discussion_r1975361890

Reply via email to