On Wed, 8 May 2024 19:09:18 GMT, Chris Plummer <cjplum...@openjdk.org> wrote:
>> src/jdk.jdwp.agent/share/native/libjdwp/util.c line 1117: >> >>> 1115: jrawMonitorID monitor; >>> 1116: const char* name; >>> 1117: DebugRawMonitorRank rank; >> >> Nit: Please, consider to add same comment for lines #1116-1117 as for the >> line #1119 below. >> It might be useful to move the field `ownerThread` before the other fields >> (not sure about the `monitor` field), so the same comment can be shared by >> multiple fields. > > I kind of don't want to distract from the point that ownerThread is protected > by the dbgRawMonitor, and that is the main purpose of dbgRawMonitor. Once you > have verified that ownerThread is the current thread, you can release the > dbgRawMonitor and access the rank and name fields safely. > > There is a race issue with all the fields during debugMonitorCreate() and > verifyMonitorRank(), which is why the debugMonitorCreate() must hold the > dbgRawMonitor(). However, there is not a race with the fields (other than > ownerThread) for the DebugRawMonitor passed into the debugMonitorXXX() APIs > because they are not called until the DebugRawMonitor is done being > initialized. So this means that debugMonitorXXX() can access the monitor, > name, and rank fields without holding dbgRawMonitor, because they are > guaranteed to be fully initialized by that point, and they don't change. > ownerThread does change, so you must access it while holding the > dbgRawMonitor. Technically speaking entryCount could also be changed by other > threads, but we don't access it until we know the current thread owns the > DebugRawMonitor, so it is safe to access (no other thread would modify or > access it). > > To put this another way, the debugMonitorXXX() APIs can safely access most of > the DebugRawMonitor fields for the DebugRawMonitor passed in because we know > they are initialized by this point and don't change. ownerThread (and to some > extent entryCount) are the exception. verifyMonitorRank() introduces > additional synchronization issues because it iterates over all > DebugRawMonitors, and some might be in the middle of creation, so some > synchronization with the creation code is needed. > > However, I now realize that if we initialized all the monitors up front, then > there would be no need to hold dbgRawMonitor during debugMonitorCreate(), > although this does not allow for any improvements in verifyMonitorRank() > because it still needs to hold the dbgRawMonitor due to accessing the > ownerThread field. No pressure, it is up to you. I just wonder if there is any room to make it a little bit more clear and simple. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/19044#discussion_r1594587018