summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java
diff options
context:
space:
mode:
authorSilenio Quarti <silenio>2007-07-23 16:20:58 +0000
committerSilenio Quarti <silenio>2007-07-23 16:20:58 +0000
commit8a9d27eae2cbc0b7ce746fd7d7fc942e2b8f7174 (patch)
treebecbdb8e64b8fe486afd37623bf4dcecdbe19b92 /bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java
parent55e3b63831d9c7ca4bf6dd222fd5772198431643 (diff)
downloadeclipse.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/eclipse/swt/graphics/Device.java')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/graphics/Device.java81
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) {