Skip to content

Commit 4da78e2

Browse files
HeikoKlareamartya4256
authored andcommitted
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.
1 parent a026b13 commit 4da78e2

1 file changed

Lines changed: 21 additions & 4 deletions

File tree

  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Image.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,20 @@ InternalImageHandle getOrCreate(int zoom, Supplier<DestroyableImageHandle> creat
159159
return imageHandle;
160160
}
161161

162-
imageHandle = creator.get();
163-
zoomLevelToImageHandle.put(zoom, imageHandle);
164-
return imageHandle;
162+
synchronized (zoomLevelToImageHandle) {
163+
imageHandle = (DestroyableImageHandle) get(zoom);
164+
if (imageHandle == null) {
165+
imageHandle = creator.get();
166+
zoomLevelToImageHandle.put(zoom, imageHandle);
167+
}
168+
return imageHandle;
169+
}
170+
}
171+
172+
<T> T runSynchronized(Supplier<T> supplier) {
173+
synchronized (zoomLevelToImageHandle) {
174+
return supplier.get();
175+
}
165176
}
166177

167178
boolean contains(int zoom) {
@@ -1388,7 +1399,13 @@ public ImageData getImageData (int zoom) {
13881399
return imageHandle.getImageData();
13891400
}
13901401

1391-
return this.imageProvider.newImageData(zoom);
1402+
return imageHandleManager.runSynchronized(() -> {
1403+
InternalImageHandle obtainedImageHandle = imageHandleManager.get(zoom);
1404+
if (obtainedImageHandle != null) {
1405+
return obtainedImageHandle.getImageData();
1406+
}
1407+
return this.imageProvider.newImageData(zoom);
1408+
});
13921409
}
13931410

13941411
/**

0 commit comments

Comments
 (0)