summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java
diff options
context:
space:
mode:
authorSilenio Quarti <silenio>2007-04-23 21:56:41 +0000
committerSilenio Quarti <silenio>2007-04-23 21:56:41 +0000
commit61e93ffeef869fe08ad54c059aecd52c9da29b71 (patch)
tree7b5b1a4c62099a46f0965260f4bae212b41d86ed /bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java
parent45bd6882b89a28418cf82b050cd85ff9c325f6c8 (diff)
downloadeclipse.platform.swt-61e93ffeef869fe08ad54c059aecd52c9da29b71.tar.gz
eclipse.platform.swt-61e93ffeef869fe08ad54c059aecd52c9da29b71.tar.xz
eclipse.platform.swt-61e93ffeef869fe08ad54c059aecd52c9da29b71.zip
176491 MessageBox consumes 100% CPU on Linux/GTK
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java61
1 files changed, 53 insertions, 8 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java
index 648e9c5d98..594b75b29e 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java
@@ -192,9 +192,13 @@ public class Display extends Device {
/* Idle proc callback */
int /*long*/ idleProc;
+ int idleHandle;
Callback idleCallback;
- static final String IDLE_PROC_KEY = "org.eclipse.swt.internal.gtk2.idleProc";
-
+ static final String ADD_IDLE_PROC_KEY = "org.eclipse.swt.internal.gtk2.addIdleProc";
+ static final String REMOVE_IDLE_PROC_KEY = "org.eclipse.swt.internal.gtk2.removeIdleProc";
+ Object idleLock = new Object();
+ boolean idleNeeded;
+
/* GtkTreeView callbacks */
int[] treeSelection;
int treeSelectionLength;
@@ -539,6 +543,15 @@ void addGdkEvent (int /*long*/ event) {
gdkEventCount++;
}
+void addIdleProc() {
+ synchronized (idleLock){
+ this.idleNeeded = true;
+ if (idleHandle == 0) {
+ idleHandle = OS.g_idle_add (idleProc, 0);
+ }
+ }
+}
+
/**
* Adds the listener to the collection of listeners who will
* be notified when an event of the given type occurs. The event
@@ -650,6 +663,12 @@ void addWidget (int /*long*/ handle, Widget widget) {
*/
public void asyncExec (Runnable runnable) {
if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
+ synchronized (idleLock) {
+ if (idleNeeded && idleHandle == 0) {
+ //NOTE: calling unlocked function in OS
+ idleHandle = OS._g_idle_add (idleProc, 0);
+ }
+ }
synchronizer.asyncExec (runnable);
}
@@ -1502,9 +1521,6 @@ public Object getData (String key) {
if (key.equals (DISPATCH_EVENT_KEY)) {
return dispatchEvents;
}
- if (key.equals (IDLE_PROC_KEY)) {
- return new LONG (idleProc);
- }
if (keys == null) return null;
for (int i=0; i<keys.length; i++) {
if (keys [i].equals (key)) return values [i];
@@ -2212,8 +2228,13 @@ Widget getWidget (int /*long*/ handle) {
}
int /*long*/ idleProc (int /*long*/ data) {
- runAsyncMessages (false);
- return 1;
+ boolean result = runAsyncMessages (false);
+ if (!result) {
+ synchronized (idleLock) {
+ idleHandle = 0;
+ }
+ }
+ return result ? 1 : 0;
}
/**
@@ -3046,7 +3067,9 @@ void releaseDisplay () {
/* Dispose the run async messages callback */
idleCallback.dispose (); idleCallback = null;
idleProc = 0;
-
+ if (idleHandle != 0) OS.g_source_remove (idleHandle);
+ idleHandle = 0;
+
/* Dispose GtkTreeView callbacks */
treeSelectionCallback.dispose (); treeSelectionCallback = null;
treeSelectionProc = 0;
@@ -3199,6 +3222,13 @@ int /*long*/ removeGdkEvent () {
return event;
}
+void removeIdleProc () {
+ synchronized(idleLock) {
+ if (idleHandle != 0) OS.g_source_remove (idleHandle);
+ idleNeeded = false;
+ idleHandle = 0;
+ }
+}
/**
* Removes the listener from the collection of listeners who will
* be notified when an event of the given type occurs. The event type
@@ -3438,6 +3468,15 @@ public void setData (String key, Object value) {
removeWidget (handle);
}
}
+
+ if (key.equals (ADD_IDLE_PROC_KEY)) {
+ addIdleProc ();
+ return;
+ }
+ if (key.equals (REMOVE_IDLE_PROC_KEY)) {
+ removeIdleProc ();
+ return;
+ }
/* Remove the key/value pair */
if (value == null) {
@@ -3846,6 +3885,12 @@ int /*long*/ styleSetProc (int /*long*/ gobject, int /*long*/ arg1, int /*long*/
*/
public void syncExec (Runnable runnable) {
if (isDisposed ()) error (SWT.ERROR_DEVICE_DISPOSED);
+ synchronized (idleLock) {
+ if (idleNeeded && idleHandle == 0) {
+ //NOTE: calling unlocked function in OS
+ idleHandle = OS._g_idle_add (idleProc, 0);
+ }
+ }
synchronizer.syncExec (runnable);
}