On Thu, 7 Apr 2022 23:03:26 GMT, Sergey Bylokhov <s...@openjdk.org> wrote:
>> Maxim Kartashev has updated the pull request with a new target base due to a >> merge or a rebase. The pull request now contains three commits: >> >> - Merge branch 'master' into JDK-8280468 >> - Addressed PR comments >> >> 1. Got rid of X11GraphicsDevice.configLock in favour of the AWT lock. >> 2. Reduced the use of the screen number (and, consequently, AWT lock >> contention) in XCanvasPeer. >> - 8280468: Crashes in getConfigColormap, getConfigVisualId, >> XVisualIDFromVisual on Linux >> >> This fix addresses two possible causes of crashes: >> 1. makeDefaultConfig() returning NULL. The fix is to die gracefully >> instead of crashing in an attempt to de-reference a NULL pointer. >> >> 2. A race condition when the number of screens change (this is only an >> issue with the number of xinerama screens; the number of X11 screens is >> static for the duration of the X session). >> >> The race scenario: X11GraphisDevice.makeDefaultConfiguration() is called >> on EDT so the call can race with X11GraphisDevice.invalidate() that >> re-sets the screen number of the device; the latter is invoked on the >> "AWT-XAWT" thread from X11GraphicsEnvironment.rebuildDevices(). So by >> the time makeDefaultConfiguration() makes a native call with the >> device's current screen number, the x11Screens array maintained by the >> native code could have become shorter. And the native methods like >> Java_sun_awt_X11GraphicsDevice_getConfigColormap() assume that the >> screen number passed to them is always current and valid. The AWT lock >> only protects against the changes during the native methods invocation, >> but does not protect against them being called with an outdated screen >> number. >> >> The fix is to eliminate the race by protecting X11GraphisDevice.screen >> with the AWT lock. > > src/java.desktop/unix/classes/sun/awt/X11/XCanvasPeer.java line 90: > >> 88: XToolkit.awtUnlock(); >> 89: } >> 90: } > > I am not sure I understand the purpose of this method, it requests the > current device for the GC, then requests the screen index of the device, and > then request device by the screen index, what is the reason to do that? Why > we cannot just use the device from the GC? This is just a named copy of lines 67 to 75. Since now this is the only piece of code that needs to work holding the AWT lock, I thought it best to isolate it. As I understand, the purpose of the piece is to find the "new" `X11GraphicsDevice` with the screen number same to the given "old" `GraphicsConfiguration`. ------------- PR: https://git.openjdk.java.net/jdk/pull/7182