Java2D's `Disposer` maintains a record of objects to dispose of with the help 
of a collection that isn't thread safe. When `DisposerRecords` objects are 
being added to it at the same time as others are being disposed on the Toolkit 
thread, chaos ensues.

This commit replaces the collection with a thread-safe  one, more consistently 
guards against exceptions in individual disposers, and adds exception's 
stacktraces printing in order to facilitate said exceptions' debugging, which 
are otherwise hard to pinpoint without code modification. 

Originally, the bug was caught on MacOS running an existing test 
(`DrawRotatedStringUsingRotatedFont`) that would occasionally crash the VM 
(probably due to double-free detected by libc that abort()'s in this case). It 
may take many re-tries to reproduce and this wasn't  observed on Linux. The new 
test (`test/jdk/sun/java2d/Disposer/TestDisposerRace.java`) displays the 
problem in a more reliable fashion and fails both on MacOS and Linux without 
this fix.

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

Commit messages:
 - 8289208: Test DrawRotatedStringUsingRotatedFont.java occasionally crashes on 
MacOS

Changes: https://git.openjdk.org/jdk/pull/9362/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=9362&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8289208
  Stats: 185 lines in 3 files changed: 165 ins; 5 del; 15 mod
  Patch: https://git.openjdk.org/jdk/pull/9362.diff
  Fetch: git fetch https://git.openjdk.org/jdk pull/9362/head:pull/9362

PR: https://git.openjdk.org/jdk/pull/9362

Reply via email to