diff options
author | Sven Gothel <[email protected]> | 2014-06-12 21:08:21 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2014-06-12 21:08:21 +0200 |
commit | 1c5b41f01c9f31f7bd787c6b194f7939904e239b (patch) | |
tree | 55f2e21b59ae3bba390a40bb88e36076272380f6 /src/newt | |
parent | 5626740d14554acf7a17a73ec12b0893445832d0 (diff) |
Fix NEWT EDTUtil Deadlock on EDTUtil.start()
DisplayImpl.runOnEDTIfAvail(..) issues EDTUtil.start()
while holding it's object-lock - if the EDT is not running,
then invokes the given task.
EDTUtil.start() impl. holds it's own edt-lock
while starting, then releases it's edt-lock while issuing a null-task.
If another thread injects a blocking task right in-between
which also acquires the display's object-lock it deadlocks.
Simply remove issuing the null-task, so EDTUtil.start()
can return immediatly (releasing edt-lock)
and allowing DisplayImpl.runOnEDTIfAvail(..)
also to release it's object-lock.
The other threads task then can be executed,
where the 'starting task' would come second - which is OK,
even though a rare occasion.
Above situation was triggered via AWT/NEWT reparenting w/ forced recreation
via TestParenting01dAWT.
+++
The null-task at EDTUtil.start() was remaining code to ensure
that the EDT completed starting, which is redundant.
Diffstat (limited to 'src/newt')
4 files changed, 15 insertions, 19 deletions
diff --git a/src/newt/classes/com/jogamp/newt/util/EDTUtil.java b/src/newt/classes/com/jogamp/newt/util/EDTUtil.java index 582dc3e1f..58aa67105 100644 --- a/src/newt/classes/com/jogamp/newt/util/EDTUtil.java +++ b/src/newt/classes/com/jogamp/newt/util/EDTUtil.java @@ -71,13 +71,13 @@ public interface EDTUtil { * and the caller should wait {@link #waitUntilStopped() until it's stopped}. * </p> * - * @return true if EDT has been successfully restarted, otherwise false * @throws IllegalStateException if EDT is running and not subject to be stopped, i.e. {@link #isRunning()} returns true + * @throws RuntimeException if EDT could not be started * * @see #invokeStop(boolean, java.lang.Runnable) * @see #waitUntilStopped() */ - public boolean start() throws IllegalStateException; + public void start() throws IllegalStateException; /** * Returns true if the current thread is the event dispatch thread (EDT). diff --git a/src/newt/classes/jogamp/newt/DefaultEDTUtil.java b/src/newt/classes/jogamp/newt/DefaultEDTUtil.java index d481ce8f9..7afa8d746 100644 --- a/src/newt/classes/jogamp/newt/DefaultEDTUtil.java +++ b/src/newt/classes/jogamp/newt/DefaultEDTUtil.java @@ -82,7 +82,7 @@ public class DefaultEDTUtil implements EDTUtil { } @Override - public final boolean start() throws IllegalStateException { + public final void start() throws IllegalStateException { synchronized(edtLock) { if( edt.isRunning() ) { throw new IllegalStateException("EDT still running and not subject to stop. Curr "+Thread.currentThread().getName()+", EDT "+edt.getName()+", isRunning "+edt.isRunning+", shouldStop "+edt.shouldStop); @@ -103,7 +103,9 @@ public class DefaultEDTUtil implements EDTUtil { } startImpl(); } - return invoke(true, nullTask); + if( !edt.isRunning() ) { + throw new RuntimeException("EDT could not be started: "+edt); + } } private final void startImpl() { diff --git a/src/newt/classes/jogamp/newt/driver/awt/AWTEDTUtil.java b/src/newt/classes/jogamp/newt/driver/awt/AWTEDTUtil.java index 4a7193306..407d3abf9 100644 --- a/src/newt/classes/jogamp/newt/driver/awt/AWTEDTUtil.java +++ b/src/newt/classes/jogamp/newt/driver/awt/AWTEDTUtil.java @@ -68,7 +68,7 @@ public class AWTEDTUtil implements EDTUtil { } @Override - public final boolean start() throws IllegalStateException { + public final void start() throws IllegalStateException { synchronized(edtLock) { if( nedt.isRunning() ) { throw new IllegalStateException("EDT still running and not subject to stop. Curr "+Thread.currentThread().getName()+", NEDT "+nedt.getName()+", isRunning "+nedt.isRunning+", shouldStop "+nedt.shouldStop+", on AWT-EDT "+EventQueue.isDispatchThread()); @@ -82,7 +82,9 @@ public class AWTEDTUtil implements EDTUtil { } startImpl(); } - return invoke(true, nullTask); + if( !nedt.isRunning() ) { + throw new RuntimeException("EDT could not be started: "+nedt); + } } private final void startImpl() { @@ -128,11 +130,6 @@ public class AWTEDTUtil implements EDTUtil { return invokeImpl(wait, task, false); } - private static Runnable nullTask = new Runnable() { - @Override - public void run() { } - }; - private final boolean invokeImpl(boolean wait, Runnable task, boolean stop) { Throwable throwable = null; RunnableTask rTask = null; diff --git a/src/newt/classes/jogamp/newt/swt/SWTEDTUtil.java b/src/newt/classes/jogamp/newt/swt/SWTEDTUtil.java index db89690f4..91c18f023 100644 --- a/src/newt/classes/jogamp/newt/swt/SWTEDTUtil.java +++ b/src/newt/classes/jogamp/newt/swt/SWTEDTUtil.java @@ -78,7 +78,7 @@ public class SWTEDTUtil implements EDTUtil { } @Override - public final boolean start() throws IllegalStateException { + public final void start() throws IllegalStateException { final boolean swtDisposed = swtDisplay.isDisposed(); synchronized(edtLock) { if( nedt.isRunning() ) { @@ -99,9 +99,11 @@ public class SWTEDTUtil implements EDTUtil { } } if( !swtDisposed ) { - return invoke(true, nullTask); + if( !nedt.isRunning() ) { + throw new RuntimeException("EDT could not be started: "+nedt); + } } else { - return false; + // FIXME: Throw exception ? } } @@ -149,11 +151,6 @@ public class SWTEDTUtil implements EDTUtil { return invokeImpl(wait, task, false); } - private static Runnable nullTask = new Runnable() { - @Override - public void run() { } - }; - private final boolean invokeImpl(boolean wait, Runnable task, boolean stop) { Throwable throwable = null; RunnableTask rTask = null; |