diff dwt/widgets/Synchronizer.d @ 213:36f5cb12e1a2

Update to SWT 3.4M7
author Frank Benoit <benoit@tionex.de>
date Sat, 17 May 2008 17:34:28 +0200
parents 3afcd4ddcf90
children fd9c62a2998e
line wrap: on
line diff
--- a/dwt/widgets/Synchronizer.d	Mon May 05 00:12:38 2008 +0200
+++ b/dwt/widgets/Synchronizer.d	Sat May 17 17:34:28 2008 +0200
@@ -20,6 +20,7 @@
 
 import dwt.DWT;
 import tango.core.Thread;
+import dwt.graphics.Device;
 import tango.core.Exception;
 
 /**
@@ -45,6 +46,8 @@
     RunnableLock [] messages;
     Object messageLock;
     Thread syncThread;
+    static final int GROW_SIZE = 4;
+    static final int MESSAGE_LIMIT = 64;
 
     //TEMPORARY CODE
     static final bool IS_CARBON = false;//"carbon".equals (DWT.getPlatform ());
@@ -62,9 +65,9 @@
 void addLast (RunnableLock lock) {
     bool wake = false;
     synchronized (messageLock) {
-        if (messages is null) messages = new RunnableLock [4];
+        if (messages is null) messages = new RunnableLock [GROW_SIZE];
         if (messageCount is messages.length) {
-            RunnableLock[] newMessages = new RunnableLock [messageCount + 4];
+            RunnableLock[] newMessages = new RunnableLock [messageCount + GROW_SIZE];
             System.arraycopy (messages, 0, newMessages, 0, messageCount);
             messages = newMessages;
         }
@@ -116,7 +119,7 @@
         System.arraycopy (messages, 1, messages, 0, --messageCount);
         messages [messageCount] = null;
         if (messageCount is 0) {
-            if (messages.length > 64) messages = null;
+            if (messages.length > MESSAGE_LIMIT) messages = null;
         }
         return lock;
     }
@@ -163,21 +166,27 @@
  * @see #asyncExec
  */
 public void syncExec (Runnable runnable) {
-    if (display.isValidThread ()) {
+    RunnableLock lock = null;
+    synchronized (Device.classinfo) {
+        if (display is null || display.isDisposed ()) DWT.error (DWT.ERROR_DEVICE_DISPOSED);
+        if (!display.isValidThread ()) {
+            if (runnable is null) {
+                display.wake ();
+                return;
+            }
+            lock = new RunnableLock (runnable);
+            /*
+             * Only remember the syncThread for syncExec.
+             */
+            lock.thread = Thread.getThis();
+            addLast (lock);
+        }
+    }
+    if (lock is null) {
         if (runnable !is null) runnable.run ();
         return;
     }
-    if (runnable is null) {
-        display.wake ();
-        return;
-    }
-    RunnableLock lock = new RunnableLock (runnable);
-    /*
-     * Only remember the syncThread for syncExec.
-     */
-    lock.thread = Thread.getThis();
     synchronized (lock) {
-        addLast (lock);
         bool interrupted = false;
         while (!lock.done ()) {
             try {