Skip to main content



      Home
Home » Eclipse Projects » Standard Widget Toolkit (SWT) » Display.getDefault().syncExec(...) deadlock?
Display.getDefault().syncExec(...) deadlock? [message #660330] Thu, 17 March 2011 18:33 Go to next message
Eclipse UserFriend
I have some code that often hangs the application when calling Display.getDefault().syncExec(...). Changing this to Display.getDefault().asyncExec(...) fixes that.

I wanted to figure out what threads are deadlocking, so I asked the Threading MBean's findDeadlockedThreads and findMonitorDeadlockedThreads, but both return null. The thread dump shows all threads RUNNABLE or TIMED_WAITING (on object monitor). There is no CPU usage, no network utilization, and no IO while the application is hanging, and the application has to be killed.

Is it correct to conclude that the deadlock must therefore be happening in native (i.e. SWT) code?
Re: Display.getDefault().syncExec(...) deadlock? [message #660369 is a reply to message #660330] Fri, 18 March 2011 03:24 Go to previous messageGo to next message
Eclipse UserFriend
Display.getDefault().syncExec() executes the runnable in the UI thread blocking the invoking thread until the runnable is executed.
If the UI thread is heavily processing other UI events or blocked on other purpose, then there is a chance that UI thread didn't get a chance to process the runnable. This might result much similar to the way that your application is hanged, though it might not theoretically.

Are you doing any UI activity during the problem scenario ? I don't think there could be any deadlock in native code of SWT, as the asyncExec functions pretty similar to syncExec with the exception that the invoking thread is not blocked.
Re: Display.getDefault().syncExec(...) deadlock? [message #660502 is a reply to message #660369] Fri, 18 March 2011 12:49 Go to previous messageGo to next message
Eclipse UserFriend
Praveen wrote on Fri, 18 March 2011 03:24
Are you doing any UI activity during the problem scenario ? I don't think there could be any deadlock in native code of SWT, as the asyncExec functions pretty similar to syncExec with the exception that the invoking thread is not blocked.


Within the Runnable, I refresh a TableViewer and mark an editor as "dirty". It's possible that this is causing some kind of deadlock, but, as mentioned, none of the threads in the application appear to be deadlocked, and the CPU usage remains at 0.
Re: Display.getDefault().syncExec(...) deadlock? [message #660507 is a reply to message #660502] Fri, 18 March 2011 13:12 Go to previous messageGo to next message
Eclipse UserFriend
If the code that is calling syncExec is running on the display thread, then this will cause the deadlock.

The Runnable passed to syncExec is placed on a queue. The display thread can't get to the queue until the current code executing on it returns. The syncExec call causes the current thread to wait. Since the Runnable can't be reached until your code returns and since your code won't return until the Runnable completes you have a deadlock.

Display thread calls your method. In your method you call syncExec which places a Runnable on the event queue. SyncExec waits for the Runnable to complete.

Since the thread is waiting, you see no CPU usage.

AsyncExec clears up the problem, because there is no wait. The asyncExec call returns, your method returns, the display thread then is able to read the event queue and process the Runnable from the asyncExec call.
Re: Display.getDefault().syncExec(...) deadlock? [message #660511 is a reply to message #660507] Fri, 18 March 2011 13:34 Go to previous message
Eclipse UserFriend
David Wegener wrote on Fri, 18 March 2011 13:12
If the code that is calling syncExec is running on the display thread, then this will cause the deadlock [...]

Thanks for the explanation. However, I don't understand why calling syncExec from the display thread doesn't deadlock all the time? In fact, the following code never seems to deadlock:

Display.getCurrent().syncExec(new Runnable() {
    @Override
    public void run() {
        log.debug("=== sync exec ===");
        Display.getCurrent().syncExec(new Runnable() {
            @Override
            public void run() {
                log.debug("=== sync exec ===");
            }
        });
    }
});
log.debug("=== done ===");

[Updated on: Fri, 18 March 2011 13:35] by Moderator

Previous Topic:How to wrap text in a Label
Next Topic:Error when opening PDF file in eclipse browser with Adobe Reader X(10.0)
Goto Forum:
  


Current Time: Wed Jul 23 14:25:17 EDT 2025

Powered by FUDForum. Page generated in 0.25418 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top