RFR: 7001973: java/awt/Graphics2D/CopyAreaOOB.java fails

Masanori Yano myano at openjdk.java.net
Thu Sep 30 08:43:30 UTC 2021


On Wed, 29 Sep 2021 00:42:01 GMT, Sergey Bylokhov <serb at openjdk.org> wrote:

> Do you know why we post it twice? It does not seem right, since we repaint all content in the apps like Netbeans/Idea and it is quite a heavyweight operation.

Because SurfaceData is judged to be lost when 1st getGraphics() is called on 1st PaintEvent processing.

https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java#L478

I traced PaintEvent, then I got following stacktrace.


breakpoint hit: "Thread=AWT-EventQueue-0", java.awt.event.PaintEvent.<init>()、line=106 bci=0

  [1] java.awt.event.PaintEvent.<init> (PaintEvent.java:106)
  [2] sun.awt.PaintEventDispatcher.createPaintEvent (PaintEventDispatcher.java:80)
  [3] sun.awt.windows.WComponentPeer.postPaintIfNecessary (WComponentPeer.java:892)
  [4] sun.awt.windows.WComponentPeer.handlePaint (WComponentPeer.java:886)
  [5] sun.java2d.d3d.D3DScreenUpdateManager.repaintPeerTarget (D3DScreenUpdateManager.java:283)
  [6] sun.java2d.d3d.D3DScreenUpdateManager.validate (D3DScreenUpdateManager.java:492)
  [7] sun.java2d.d3d.D3DScreenUpdateManager.createGraphics (D3DScreenUpdateManager.java:260)
  [8] sun.awt.windows.WComponentPeer.getGraphics (WComponentPeer.java:646)
  [9] java.awt.Component.getGraphics (Component.java:3,128)
  [10] sun.awt.RepaintArea.paint (RepaintArea.java:227)
  [11] sun.awt.windows.WComponentPeer.handleEvent (WComponentPeer.java:371)
  [12] java.awt.Component.dispatchEventImpl (Component.java:5,056)
  [13] java.awt.Container.dispatchEventImpl (Container.java:2,325)
  [14] java.awt.Window.dispatchEventImpl (Window.java:2,775)
  [15] java.awt.Component.dispatchEvent (Component.java:4,827)
  [16] java.awt.EventQueue.dispatchEventImpl (EventQueue.java:772)
  [17] java.awt.EventQueue$4.run (EventQueue.java:721)
  [18] java.awt.EventQueue$4.run (EventQueue.java:715)
  [19] java.security.AccessController.executePrivileged (AccessController.java:753)
  [20] java.security.AccessController.doPrivileged (AccessController.java:391)
  [21] java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:85)
  [22] java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:95)
  [23] java.awt.EventQueue$5.run (EventQueue.java:745)
  [24] java.awt.EventQueue$5.run (EventQueue.java:743)
  [25] java.security.AccessController.executePrivileged (AccessController.java:753)
  [26] java.security.AccessController.doPrivileged (AccessController.java:391)
  [27] java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:85)
  [28] java.awt.EventQueue.dispatchEvent (EventQueue.java:742)
  [29] java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:203)
  [30] java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread.java:124)
  [31] java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:113)
  [32] java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:109)
  [33] java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:101)
  [34] java.awt.EventDispatchThread.run (EventDispatchThread.java:90)
AWT-EventQueue-0[1] > >


At 1st PaintEvent is processing, RepaintArea calls getGraphics(), then D3DScreenUpdateManager finally calls new PaintEvent().
So, 2nd PaintEvent is posted and invoked later on EDT.

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

PR: https://git.openjdk.java.net/jdk/pull/5491



More information about the client-libs-dev mailing list