aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2010-09-27 04:53:29 +0200
committerSven Gothel <[email protected]>2010-09-27 04:53:29 +0200
commit92b6858a9acb25eba641e3f959eb7908845c874e (patch)
tree54f76bc34b1539f60ee0bf77d96efd16f11d14d8 /src
parentded3ab06cc51e8e7d12f9fbfeb12e87c04f26a5a (diff)
NEWT EDT: Handle stop case if not on EDT
Diffstat (limited to 'src')
-rw-r--r--src/newt/classes/com/jogamp/newt/impl/DefaultEDTUtil.java70
1 files changed, 43 insertions, 27 deletions
diff --git a/src/newt/classes/com/jogamp/newt/impl/DefaultEDTUtil.java b/src/newt/classes/com/jogamp/newt/impl/DefaultEDTUtil.java
index 7a76c94fc..fd68bb6cf 100644
--- a/src/newt/classes/com/jogamp/newt/impl/DefaultEDTUtil.java
+++ b/src/newt/classes/com/jogamp/newt/impl/DefaultEDTUtil.java
@@ -117,20 +117,17 @@ public class DefaultEDTUtil implements EDTUtil {
if( edt.shouldStop ) {
throw new RuntimeException("EDT about to stop: "+edt);
}
- if( isCurrentThreadEDT() ) {
- if(stop) {
- edt.shouldStop = true;
- if(DEBUG) {
- System.err.println(Thread.currentThread()+": EDT signal STOP (edt) - edt: "+edt);
- }
- }
- if(!wait && edt.tasks.size()>0) {
- // append task to ensure proper sequence
- edt.tasks.add(rTask);
- } else {
- // wait or last task, execute now
- task.run();
+ // Exception ee = new Exception("XXX stop: "+stop+", tasks: "+edt.tasks.size()+", task: "+task);
+ // ee.printStackTrace();
+ if(stop) {
+ edt.shouldStop = true;
+ if(DEBUG) {
+ System.err.println(Thread.currentThread()+
+ ": EDT signal STOP (on edt: "+isCurrentThreadEDT()+") - edt: "+edt);
}
+ }
+ if( isCurrentThreadEDT() ) {
+ task.run();
wait = false; // running in same thread (EDT) -> no wait
if(stop && edt.tasks.size()>0) {
throw new RuntimeException("Remaining EDTTasks: "+edt.tasks.size()+" - "+edt);
@@ -140,13 +137,10 @@ public class DefaultEDTUtil implements EDTUtil {
rTask = new RunnableTask(task,
wait ? rTaskLock : null,
wait /* catch Exceptions if waiting for result */);
+ if(stop) {
+ rTask.setAttachment(new Boolean(true)); // mark final task
+ }
synchronized(edt.tasks) {
- if(stop) {
- edt.shouldStop = true;
- if(DEBUG) {
- System.err.println(Thread.currentThread()+": EDT signal STOP (!edt) - edt: "+edt);
- }
- }
// append task ..
edt.tasks.add(rTask);
edt.tasks.notifyAll();
@@ -226,6 +220,7 @@ public class DefaultEDTUtil implements EDTUtil {
if(DEBUG) {
System.err.println(getName()+": EDT run() START "+ getName());
}
+ RuntimeException error = null;
try {
do {
// event dispatch
@@ -233,7 +228,7 @@ public class DefaultEDTUtil implements EDTUtil {
dispatchMessages.run();
}
// wait and work on tasks
- Runnable task = null;
+ RunnableTask task = null;
synchronized(tasks) {
// wait for tasks
if(!shouldStop && tasks.size()==0) {
@@ -245,7 +240,7 @@ public class DefaultEDTUtil implements EDTUtil {
}
// execute one task, if available
if(tasks.size()>0) {
- task = (Runnable) tasks.remove(0);
+ task = (RunnableTask) tasks.remove(0);
tasks.notifyAll();
}
}
@@ -256,15 +251,33 @@ public class DefaultEDTUtil implements EDTUtil {
} catch (Throwable t) {
// handle errors ..
shouldStop = true;
- throw new RuntimeException(getName()+": EDT run() Error", t);
+ if(t instanceof RuntimeException) {
+ error = (RuntimeException) t;
+ } else {
+ error = new RuntimeException("Within EDT", t);
+ }
} finally {
if(DEBUG) {
- System.err.println(getName()+": EDT run() END "+ getName());
+ RunnableTask rt = ( tasks.size() > 0 ) ? (RunnableTask) tasks.get(0) : null ;
+ System.err.println(getName()+": EDT run() END "+ getName()+", tasks: "+tasks.size()+", "+rt+", "+error);
}
synchronized(edtLock) {
- synchronized(tasks) {
- if(tasks.size()>0) {
- throw new RuntimeException("Remaining EDTTasks: "+tasks.size()+" - "+edt);
+ if(null==error) {
+ synchronized(tasks) {
+ // drain remaining tasks (stop not on EDT),
+ // while having tasks and no previous-task, or previous-task is non final
+ RunnableTask task = null;
+ while ( ( null == task || task.getAttachment() == null ) && tasks.size() > 0 ) {
+ task = ( RunnableTask ) tasks.remove(0);
+ task.run();
+ tasks.notifyAll();
+ }
+ if(null!=task && task.getAttachment()==null) {
+ error = new RuntimeException("Last EDTTasks Not Final: "+tasks.size()+
+ ", "+task+" - "+edt);
+ } else if(tasks.size()>0) {
+ error = new RuntimeException("Remaining EDTTasks Post Final: "+tasks.size());
+ }
}
}
isRunning = !shouldStop;
@@ -273,7 +286,10 @@ public class DefaultEDTUtil implements EDTUtil {
}
}
if(DEBUG) {
- System.err.println(getName()+": EDT run() EXIT "+ getName());
+ System.err.println(getName()+": EDT run() EXIT "+ getName()+", "+error);
+ }
+ if(null!=error) {
+ throw error;
}
}
}