On Fri, 10 May 2024 07:45:02 GMT, Jaikiran Pai <j...@openjdk.org> wrote:

>> Pavel Rappo has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   Fix System.console().readln(null) in jshell
>>   
>>   Without it, jshell hangs on me. Will think of a test.
>
> src/java.base/share/classes/jdk/internal/io/JdkConsoleImpl.java line 61:
> 
>> 59:     @Override
>> 60:     public JdkConsole println(Object obj) {
>> 61:         pw.println(obj);
> 
> Are these `println(...)` and `print(...)` methods intentionally not using a 
> `writeLock` unlike the `readln(...)` and `readLine(...)` methods which do use 
> (read and write) locks?

When implementing, I asked myself if I must use any of those monitors and 
decided that I don't have to. My reasoning is below.

`readLock`:

- is used inside the object that `Reader reader` is initialised with, and

- it also guards fields such as `char[] rcb`, `boolean restoreEcho` and 
`boolean shutdownHookInstalled`.

Since `println` and `print` don't call methods on `reader` or access the above 
fields, they don't require `readLock`.

`writeLock`:

- is used inside objects that `Writer out` and `PrintWriter pw` are initialised 
with, and
- also in compound operations that first write and then immediately read. (I 
assume, it's so that no concurrent write could sneak in between writing and 
reading parts of such a compound.)

`println` or `print` don't call methods on `out` and certainly don't do any 
write-read compounds. That said, they call methods on `pw`. But `pw` uses 
`writeLock` internally. So in that sense we're covered. 

One potential concern is a write-write compound in `print`:


    @Override
    public JdkConsole print(Object obj) {
        pw.print(obj);
        pw.flush(); // automatic flushing does not cover print
        return this;
    }


I'm saying write-_write_, not write-_flush_, because as far as synchronisation 
is concerned,  `pw.flush()` should behave the same as `pw.print("")`.

While not using `writeLock` is not strictly correct, I believe the potential 
execution interleavings with other writes are benign. What's the worst that 
could happen? You flush more than you expected? Big deal!

Since we exhausted all the reasons to use `writeLock`, I don't think we need 
one.



Naoto has already reviewed this PR with only minor comments. While that 
increases my confidence in that the implementation is correct, it doesn't hurt 
to request re-review of this specific part: @naotoj, do you think I should use 
any of those monitors?

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

PR Review Comment: https://git.openjdk.org/jdk/pull/19112#discussion_r1596861708

Reply via email to