diff options
author | Silenio Quarti <silenio> | 2007-07-23 16:20:58 +0000 |
---|---|---|
committer | Silenio Quarti <silenio> | 2007-07-23 16:20:58 +0000 |
commit | 8a9d27eae2cbc0b7ce746fd7d7fc942e2b8f7174 (patch) | |
tree | becbdb8e64b8fe486afd37623bf4dcecdbe19b92 /bundles/org.eclipse.swt/Eclipse SWT/gtk/org | |
parent | 55e3b63831d9c7ca4bf6dd222fd5772198431643 (diff) | |
download | eclipse.platform.swt-8a9d27eae2cbc0b7ce746fd7d7fc942e2b8f7174.tar.gz eclipse.platform.swt-8a9d27eae2cbc0b7ce746fd7d7fc942e2b8f7174.tar.xz eclipse.platform.swt-8a9d27eae2cbc0b7ce746fd7d7fc942e2b8f7174.zip |
193213 - ArrayIndexOutOfBounds when initializing GC
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/gtk/org')
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java | 81 |
1 files changed, 48 insertions, 33 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java index 35c25544d0..495cdf733e 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java @@ -41,6 +41,7 @@ public abstract class Device implements Drawable { boolean tracking = DEBUG; Error [] errors; Object [] objects; + Object trackingLock; /* Colormap and reference count */ GdkColor [] gdkColors; @@ -148,6 +149,7 @@ public Device(DeviceData data) { if (tracking) { errors = new Error [128]; objects = new Object [128]; + trackingLock = new Object (); } create (data); init (); @@ -240,17 +242,22 @@ public void dispose () { xDisplay = 0; 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; + } } } } @@ -320,20 +327,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; } @@ -702,21 +715,23 @@ int /*long*/ logProc (int /*long*/ log_domain, int /*long*/ log_level, int /*lon } 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; } static synchronized void register (Device device) { |