[OpenJDK Rasterizer] Segfault in marlin code for Java 9 ea100
Jim Graham
james.graham at oracle.com
Fri Feb 5 01:17:33 UTC 2016
Ah, interesting,
Yes, TileState in AAShapePipe is also a problem for reentrancy. It has
a lower resulting damage potential given the nature of the data it
holds, but it can still cause problems. The defensive copy of the abox
values is one step to help here, but it isn't complete.
Now that you point it out, I just noticed a bug in the way you cache the
abox values - they might be modified between when you cache them and
when you use them in the for loops... :(
...jim
On 2/4/2016 2:43 PM, Laurent Bourgès wrote:
> Jim,
> Jim, here are my comments:
>
> 2016-02-04 2:55 GMT+01:00 Jim Graham <james.graham at oracle.com
> <mailto:james.graham at oracle.com>>:
>
> Interesting, so this can happen with any custom Paint or Composite.
> Yes, re-entrance detection should be done.
>
>
> FYI, I proposed a bug fix and also checked the output images are now
> correct:
> http://mail.openjdk.java.net/pipermail/2d-dev/2016-February/006272.html
>
> Please also check twice AAShapePipe as it may also have problem with
> reentrancy as the TileState is in thread-local storage too:
> Should I also use another TileState ?
> I fixed an issue with int[] abox but I eventually see another issue with
> the int[] alpha if outpipe.renderPathTile() make reentrant calls too !
>
> Just out of curiosity - the 10% performance hit for the CLQ storage
> vs. thread-local - that was specifically only for the time it takes
> to retreive the Renderer, right? I can't imagine why the entire
> rendering operation would take 10% longer for any mechanism that
> retrieves a cached Renderer - unless perhaps it was missing the
> cache and allocating a new one every time? I would think a simple
> synchronized block around a small cache of Renderers would be nearly
> imperceptible compared to the amount of time spent inside the
> rendering process...
>
>
> Let me try to explain:
> In my MapBench tool, I have a very complex map [135 000 shapes]:
> dc_shp_alllayers_2013-00-30-07-00-47.ser
>
> - Marlin [TL]:
> Test Threads Ops
> Med Pct95 Avg StdDev Min Max FPS(med) TotalOps
> [ms/op]
> dc_shp_alllayers_2013-00-30-07-00-47.ser 1 25 778.610
> 779.885 778.876 0.622 777.904 780.050 1.284 25
> dc_shp_alllayers_2013-00-30-07-00-47.ser 2 50 780.596
> 781.677 780.532 0.733 779.091 782.623 1.281 50
> dc_shp_alllayers_2013-00-30-07-00-47.ser 4 100 781.663
> 788.781 783.098 4.548 779.113 805.189 1.279 100
>
> - Marlin [CLQ]:
> Test Threads Ops Med Pct95 Avg StdDev Min Max
> FPS(med) TotalOps [ms/op]
> dc_shp_alllayers_2013-00-30-07-00-47.ser 1 25 787.245
> 789.810 787.370 1.556 784.139 790.589 1.270 25
> dc_shp_alllayers_2013-00-30-07-00-47.ser 2 50 846.023
> 877.742 853.157 19.231 818.292 885.293 1.182 50
> dc_shp_alllayers_2013-00-30-07-00-47.ser 4 100 826.174
> 851.683 831.681 12.548 814.943 871.630 1.210 100
>
> As you can see, the 8 to 10% difference corresponds to the ratio between
> total times taken to render the map [877ms vs 780ms] (on the 95th
> percentile) that happens with 2 or 4 concurrent threads.
>
>
> I guess:
> 1. threads are rendering many shapes in parallel (135k) so there is a
> high pressure on the underlying ConcurrentLinkedQueue to add/remove the
> RendererContext instances.
> I tried also with a simple synchronized(ArrayDeque) that is slightly
> slower than CLQ (high concurrency) as all threads are busy.
>
> 2. More garbage is produced as every CLQ.offer() will create a CLQ.Node
> as seen with jmap -histo <pid>:
>
> num #instances #bytes class name
> ----------------------------------------------
> 1: 3370992 107871744 java.awt.geom.Path2D$Float$CopyIterator
> * 2: 3370996 80903904
> java.util.concurrent.ConcurrentLinkedQueue$Node
> * 3: 135226 9736272 java.awt.geom.AffineTransform
> 4: 858 8430464 [I
> 5: 135309 7770696 [F
> 6: 135213 6490224 it.geosolutions.java2d.DrawingCommand
> 7: 135213 4326816 java.awt.geom.GeneralPath
> 8: 99122 3964880 java.awt.BasicStroke
> 9: 99118 3964720
> it.geosolutions.java2d.SerializableBasicStroke
> 10: 135391 3500728 [B
> 11: 135213 3245112
> it.geosolutions.java2d.SerializableAlphaComposite
>
> PS: the most important garbage corresponds to the
> Path2D.Float.CopyIterator instances : that could also be improved ...
>
> Regards,
> Laurent
More information about the graphics-rasterizer-dev
mailing list