From 4da78e2b6f46cc4cc142d8105dac3a856647a406 Mon Sep 17 00:00:00 2001 From: "Klare, Heiko" Date: Fri, 12 Dec 2025 13:50:33 +0100 Subject: [PATCH] Make ImageHandle & ImageData write ops synchronous This commit makes the ImageHandle creation and ImageData caching process synchronous to avoid any racing condition and inefficient memory usages. --- .../win32/org/eclipse/swt/graphics/Image.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java index 32067a81de..07d1d26058 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java @@ -159,9 +159,20 @@ InternalImageHandle getOrCreate(int zoom, Supplier creat return imageHandle; } - imageHandle = creator.get(); - zoomLevelToImageHandle.put(zoom, imageHandle); - return imageHandle; + synchronized (zoomLevelToImageHandle) { + imageHandle = (DestroyableImageHandle) get(zoom); + if (imageHandle == null) { + imageHandle = creator.get(); + zoomLevelToImageHandle.put(zoom, imageHandle); + } + return imageHandle; + } + } + + T runSynchronized(Supplier supplier) { + synchronized (zoomLevelToImageHandle) { + return supplier.get(); + } } boolean contains(int zoom) { @@ -1388,7 +1399,13 @@ public ImageData getImageData (int zoom) { return imageHandle.getImageData(); } - return this.imageProvider.newImageData(zoom); + return imageHandleManager.runSynchronized(() -> { + InternalImageHandle obtainedImageHandle = imageHandleManager.get(zoom); + if (obtainedImageHandle != null) { + return obtainedImageHandle.getImageData(); + } + return this.imageProvider.newImageData(zoom); + }); } /**