diff options
author | Silenio Quarti <silenio> | 2007-07-23 18:07:42 +0000 |
---|---|---|
committer | Silenio Quarti <silenio> | 2007-07-23 18:07:42 +0000 |
commit | 49bb6fbf73d53696e364d9b252a91d217adac0d0 (patch) | |
tree | cbaff1c44aa773e4baacb19554cff41ffda4835a /bundles/org.eclipse.swt/Eclipse SWT/win32/org | |
parent | 68636a56d8d850b4f73d1c0b16c1b71a8e851ba7 (diff) | |
download | eclipse.platform.swt-49bb6fbf73d53696e364d9b252a91d217adac0d0.tar.gz eclipse.platform.swt-49bb6fbf73d53696e364d9b252a91d217adac0d0.tar.xz eclipse.platform.swt-49bb6fbf73d53696e364d9b252a91d217adac0d0.zip |
193213 - ArrayIndexOutOfBounds when initializing GC
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/win32/org')
-rwxr-xr-x | bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Device.java | 81 |
1 files changed, 48 insertions, 33 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Device.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Device.java index a7aba8caa2..72bb27ca85 100755 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Device.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/Device.java @@ -30,6 +30,7 @@ public abstract class Device implements Drawable { boolean tracking = DEBUG; Error [] errors; Object [] objects; + Object trackingLock; /** * Palette @@ -131,6 +132,7 @@ public Device(DeviceData data) { if (tracking) { errors = new Error [128]; objects = new Object [128]; + trackingLock = new Object (); } /* Initialize the system font slot */ @@ -262,17 +264,22 @@ public void dispose () { destroy (); disposed = true; if (tracking) { - objects = null; - errors = null; + synchronized (trackingLock) { + objects = null; + errors = null; + trackingLock = null; + } } } void dispose_Object (Object object) { - for (int i=0; i<objects.length; i++) { - if (objects [i] == object) { - objects [i] = null; - errors [i] = null; - return; + synchronized (trackingLock) { + for (int i=0; i<objects.length; i++) { + if (objects [i] == object) { + objects [i] = null; + errors [i] = null; + return; + } } } } @@ -349,20 +356,26 @@ public DeviceData getDeviceData () { DeviceData data = new DeviceData (); data.debug = debug; data.tracking = tracking; - int count = 0, length = 0; - if (tracking) length = objects.length; - for (int i=0; i<length; i++) { - if (objects [i] != null) count++; - } - int index = 0; - data.objects = new Object [count]; - data.errors = new Error [count]; - for (int i=0; i<length; i++) { - if (objects [i] != null) { - data.objects [index] = objects [i]; - data.errors [index] = errors [i]; - index++; + if (tracking) { + synchronized (trackingLock) { + int count = 0, length = objects.length; + for (int i=0; i<length; i++) { + if (objects [i] != null) count++; + } + int index = 0; + data.objects = new Object [count]; + data.errors = new Error [count]; + for (int i=0; i<length; i++) { + if (objects [i] != null) { + data.objects [index] = objects [i]; + data.errors [index] = errors [i]; + index++; + } + } } + } else { + data.objects = new Object [0]; + data.errors = new Error [0]; } return data; } @@ -781,21 +794,23 @@ public boolean loadFont (String path) { } void new_Object (Object object) { - for (int i=0; i<objects.length; i++) { - if (objects [i] == null) { - objects [i] = object; - errors [i] = new Error (); - return; + synchronized (trackingLock) { + for (int i=0; i<objects.length; i++) { + if (objects [i] == null) { + objects [i] = object; + errors [i] = new Error (); + return; + } } + Object [] newObjects = new Object [objects.length + 128]; + System.arraycopy (objects, 0, newObjects, 0, objects.length); + newObjects [objects.length] = object; + objects = newObjects; + Error [] newErrors = new Error [errors.length + 128]; + System.arraycopy (errors, 0, newErrors, 0, errors.length); + newErrors [errors.length] = new Error (); + errors = newErrors; } - Object [] newObjects = new Object [objects.length + 128]; - System.arraycopy (objects, 0, newObjects, 0, objects.length); - newObjects [objects.length] = object; - objects = newObjects; - Error [] newErrors = new Error [errors.length + 128]; - System.arraycopy (errors, 0, newErrors, 0, errors.length); - newErrors [errors.length] = new Error (); - errors = newErrors; } /** |