Skip to content

Commit 0e6ad0d

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 754103f commit 0e6ad0d

File tree

1 file changed

+21
-4
lines changed
  • bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics

1 file changed

+21
-4
lines changed

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
@@ -158,9 +158,20 @@ ImageHandle getHandleOrCreate(int zoom, Supplier<ImageHandle> creator) {
158158
return imageHandle;
159159
}
160160

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

166177
boolean hasImageHandle(ImageHandle imageHandle) {
@@ -1382,7 +1393,13 @@ public ImageData getImageData (int zoom) {
13821393
return imageHandle.getImageData();
13831394
}
13841395

1385-
return this.imageProvider.newImageData(zoom);
1396+
return imageHandleManager.runSynchronized(() -> {
1397+
ImageHandle obtainedImageHandle = imageHandleManager.getImageHandle(zoom);
1398+
if (obtainedImageHandle != null) {
1399+
return obtainedImageHandle.getImageData();
1400+
}
1401+
return this.imageProvider.newImageData(zoom);
1402+
});
13861403
}
13871404

13881405
/**

0 commit comments

Comments
 (0)