diff options
author | Sven Gothel <[email protected]> | 2012-11-25 14:58:05 +0100 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2012-11-25 14:58:05 +0100 |
commit | b6fa407d4bf19ef9fe387454b5eeca68853532b9 (patch) | |
tree | 21a38eb9244329c13a1e9f16952c28182188296e /src/newt | |
parent | cc5fb8d9f807089c5d119f3b56eed7d018a1dba2 (diff) |
SWTEDTUtil/AWTEDTUtil: Fix deadlock situation in waitUntilStopped(), etc - wrap task execution (or enqueing) into status-sync 'edtLock'
This fixes the disparity w/ DefaultEDTUtil, i.e. aligns it's implementation/semantics.
Diffstat (limited to 'src/newt')
-rw-r--r-- | src/newt/classes/com/jogamp/newt/swt/SWTEDTUtil.java | 24 | ||||
-rw-r--r-- | src/newt/classes/jogamp/newt/DefaultEDTUtil.java | 2 | ||||
-rw-r--r-- | src/newt/classes/jogamp/newt/driver/awt/AWTEDTUtil.java | 14 |
3 files changed, 25 insertions, 15 deletions
diff --git a/src/newt/classes/com/jogamp/newt/swt/SWTEDTUtil.java b/src/newt/classes/com/jogamp/newt/swt/SWTEDTUtil.java index d40aa18cf..d08fefa29 100644 --- a/src/newt/classes/com/jogamp/newt/swt/SWTEDTUtil.java +++ b/src/newt/classes/com/jogamp/newt/swt/SWTEDTUtil.java @@ -154,17 +154,23 @@ public class SWTEDTUtil implements EDTUtil { // Thread.dumpStack(); } } - - // start if should not stop && not started yet - if( !stop && !nedt.isRunning() ) { - startImpl(); + if( isCurrentThreadEDT() ) { + task.run(); + wait = false; // running in same thread (EDT) -> no wait + } else if( swtDisplay.isDisposed() ) { + wait = false; // drop task, SWT disposed + } else { + // start if should not stop && not started yet + if( !stop && !nedt.isRunning() ) { + startImpl(); + } + if(wait) { + swtDisplay.syncExec(task); + } else { + swtDisplay.asyncExec(task); + } } } - if(wait) { - swtDisplay.syncExec(task); - } else { - swtDisplay.asyncExec(task); - } } @Override diff --git a/src/newt/classes/jogamp/newt/DefaultEDTUtil.java b/src/newt/classes/jogamp/newt/DefaultEDTUtil.java index 18418a8dc..98987ef96 100644 --- a/src/newt/classes/jogamp/newt/DefaultEDTUtil.java +++ b/src/newt/classes/jogamp/newt/DefaultEDTUtil.java @@ -150,7 +150,7 @@ public class DefaultEDTUtil implements EDTUtil { System.err.println("Warning: EDT about (1) to stop, won't enqueue new task: "+edt); Thread.dumpStack(); } - return; + return; } // System.err.println(Thread.currentThread()+" XXX stop: "+stop+", tasks: "+edt.tasks.size()+", task: "+task); // Thread.dumpStack(); diff --git a/src/newt/classes/jogamp/newt/driver/awt/AWTEDTUtil.java b/src/newt/classes/jogamp/newt/driver/awt/AWTEDTUtil.java index 6fa053dd3..01b5ad8a4 100644 --- a/src/newt/classes/jogamp/newt/driver/awt/AWTEDTUtil.java +++ b/src/newt/classes/jogamp/newt/driver/awt/AWTEDTUtil.java @@ -142,13 +142,17 @@ public class AWTEDTUtil implements EDTUtil { // Thread.dumpStack(); } } - - // start if should not stop && not started yet - if( !stop && !nedt.isRunning() ) { - startImpl(); + if( isCurrentThreadEDT() ) { + task.run(); + wait = false; // running in same thread (EDT) -> no wait + } else { + // start if should not stop && not started yet + if( !stop && !nedt.isRunning() ) { + startImpl(); + } + AWTEDTExecutor.singleton.invoke(wait, task); } } - AWTEDTExecutor.singleton.invoke(wait, task); } @Override |