From d4712141f33aa3ca57146a75c66b77e93f9963fb Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Wed, 18 Mar 2026 05:41:48 +1300 Subject: [PATCH] Improve thread safety in AquaNativeRendering and close stream in getStringResource() Make createPainter() consistent with the thread-aware synchronized findPainterClasses() by ensuring isInitialized is volatile and is set after preferredPainter. This guarantees correct visibility if createPainter() is ever called from outside the UI thread. Also close the InputStream in getStringResource() using try-with-resources. --- src/org/violetlib/jnr/aqua/AquaNativeRendering.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/org/violetlib/jnr/aqua/AquaNativeRendering.java b/src/org/violetlib/jnr/aqua/AquaNativeRendering.java index fa2fe4b..dd757d1 100644 --- a/src/org/violetlib/jnr/aqua/AquaNativeRendering.java +++ b/src/org/violetlib/jnr/aqua/AquaNativeRendering.java @@ -28,7 +28,7 @@ public class AquaNativeRendering { - private static boolean isInitialized; + private static volatile boolean isInitialized; private static @Nullable AquaUIPainter preferredPainter; @@ -100,9 +100,8 @@ public static void showVersion() { private static @NotNull String getStringResource(@NotNull String name) { - InputStream s = AquaNativeRendering.class.getResourceAsStream(name); - if (s != null) { - try { + try (InputStream s = AquaNativeRendering.class.getResourceAsStream(name)) { + if (s != null) { BufferedReader r = new BufferedReader(new InputStreamReader(s)); StringBuilder sb = new StringBuilder(); for (; ; ) { @@ -113,8 +112,8 @@ public static void showVersion() { sb.append((char) ch); } return sb.toString(); - } catch (IOException ex) { } + } catch (IOException ex) { } return "Unknown"; @@ -126,8 +125,6 @@ private static synchronized void findPainterClasses() return; } - isInitialized = true; - AquaUIPainter viewPainter; AquaUIPainter coreUIPainter; AquaUIPainter jrsPainter = null; @@ -171,6 +168,8 @@ private static synchronized void findPainterClasses() debug("Using JRS painter as preferred painter"); preferredPainter = jrsPainter; // last because it has the most limitations } + + isInitialized = true; } protected static void debug(@NotNull String s)