Mercurial > projects > dwt-win
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 {