On Sat, 11 May 2024 15:00:09 GMT, Alan Bateman <al...@openjdk.org> wrote:

>> A compromise between performance and readability is:
>> 
>> if (JFRTracing.isEnabled()) {
>>       ...
>> }
>> 
>> One additional class is loaded, but it's more clear where it comes from. I 
>> didn't want to do that for the ThrowableTracer class since it had a clinit.
>> 
>> This could potentially cause problems if JFRTracing is loaded early from 
>> Throwable or other class in the future. The static boolean flag is more 
>> safe, so probably better.
>
> One thing that isn't clear (to me anyway) is how it works with the memory 
> model. It's plain read at the use sites, looks like the set when recording is 
> turned on is also a plain write. Would it be possible to summarise what else 
> happens when recording is turned on?

During JFR initialization, jfrTracing flag is set to true by the JFRTracing 
class. Then, when the recording starts, a safepoint occurs, and all Java 
threads are stopped at a poll site. When they wake up and eventually read the 
memory of the jfrTracing field, it will be true because of memory fences 
related to the safepoint.

I guess it's not 100% safe if the JIT decides to store the read value elsewhere 
over several event checks, but it seems unlikely. Event settings checks (i.e., 
Event::isEnabled()) have always used plain reads, so it is not more unreliable 
than any other event.

I'm fine with using a volatile too. I used it for the exception events, but I 
now think a plain write/read of jfrTracing is safe for all practical purposes.

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

PR Review Comment: https://git.openjdk.org/jdk/pull/19129#discussion_r1597639174

Reply via email to