Skip to content

Commit eb01fd2

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 eb01fd2

1 file changed

Lines changed: 37 additions & 17 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: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,19 @@ InternalImageHandle getOrCreate(int zoom, Supplier<DestroyableImageHandle> creat
154154
return null;
155155
}
156156

157-
DestroyableImageHandle imageHandle = (DestroyableImageHandle) get(zoom);
158-
if (imageHandle != null) {
159-
return imageHandle;
157+
DestroyableImageHandle registeredimageHandle = (DestroyableImageHandle) get(zoom);
158+
if (registeredimageHandle != null) {
159+
return registeredimageHandle;
160160
}
161161

162-
imageHandle = creator.get();
163-
zoomLevelToImageHandle.put(zoom, imageHandle);
164-
return imageHandle;
162+
return runSynchronized(() -> {
163+
DestroyableImageHandle imageHandle = (DestroyableImageHandle) get(zoom);
164+
if (imageHandle == null) {
165+
imageHandle = creator.get();
166+
zoomLevelToImageHandle.put(zoom, imageHandle);
167+
}
168+
return imageHandle;
169+
});
165170
}
166171

167172
boolean contains(int zoom) {
@@ -181,15 +186,24 @@ Set<Integer> getAllZooms() {
181186
}
182187

183188
void destroyHandles(Predicate<Integer> filter) {
184-
Iterator<Entry<Integer, DestroyableImageHandle>> it = zoomLevelToImageHandle.entrySet().iterator();
185-
while (it.hasNext()) {
186-
Entry<Integer, DestroyableImageHandle> zoomToHandle = it.next();
187-
if (filter.test(zoomToHandle.getKey())) {
188-
DestroyableImageHandle imageHandle = zoomToHandle.getValue();
189-
it.remove();
190-
zoomLevelToImageHandle.remove(imageHandle.zoom, imageHandle);
191-
imageHandle.destroy();
189+
runSynchronized(() -> {
190+
Iterator<Entry<Integer, DestroyableImageHandle>> it = zoomLevelToImageHandle.entrySet().iterator();
191+
while (it.hasNext()) {
192+
Entry<Integer, DestroyableImageHandle> zoomToHandle = it.next();
193+
if (filter.test(zoomToHandle.getKey())) {
194+
DestroyableImageHandle imageHandle = zoomToHandle.getValue();
195+
it.remove();
196+
zoomLevelToImageHandle.remove(imageHandle.zoom, imageHandle);
197+
imageHandle.destroy();
198+
}
192199
}
200+
return null;
201+
});
202+
}
203+
204+
<T> T runSynchronized(Supplier<T> supplier) {
205+
synchronized (this) {
206+
return supplier.get();
193207
}
194208
}
195209

@@ -1304,8 +1318,8 @@ public Rectangle getBounds() {
13041318

13051319
Rectangle getBounds(int zoom) {
13061320
if (isDisposed()) SWT.error(SWT.ERROR_GRAPHIC_DISPOSED);
1307-
if (imageHandleManager.contains(zoom)) {
1308-
ImageHandle imageMetadata = imageHandleManager.get(zoom);
1321+
ImageHandle imageMetadata = imageHandleManager.get(zoom);
1322+
if (imageMetadata != null) {
13091323
Rectangle rectangle = new Rectangle(0, 0, imageMetadata.width, imageMetadata.height);
13101324
return Win32DPIUtils.scaleBounds(rectangle, zoom, imageMetadata.zoom);
13111325
}
@@ -1388,7 +1402,13 @@ public ImageData getImageData (int zoom) {
13881402
return imageHandle.getImageData();
13891403
}
13901404

1391-
return this.imageProvider.newImageData(zoom);
1405+
return imageHandleManager.runSynchronized(() -> {
1406+
InternalImageHandle obtainedImageHandle = imageHandleManager.get(zoom);
1407+
if (obtainedImageHandle != null) {
1408+
return obtainedImageHandle.getImageData();
1409+
}
1410+
return this.imageProvider.newImageData(zoom);
1411+
});
13921412
}
13931413

13941414
/**

0 commit comments

Comments
 (0)