diff options
-rwxr-xr-x | src/classes/com/sun/opengl/impl/GLWorkerThread.java | 24 | ||||
-rwxr-xr-x | src/classes/javax/media/opengl/Threading.java | 8 |
2 files changed, 23 insertions, 9 deletions
diff --git a/src/classes/com/sun/opengl/impl/GLWorkerThread.java b/src/classes/com/sun/opengl/impl/GLWorkerThread.java index 7c1d7413b..52ada9bac 100755 --- a/src/classes/com/sun/opengl/impl/GLWorkerThread.java +++ b/src/classes/com/sun/opengl/impl/GLWorkerThread.java @@ -39,6 +39,8 @@ package com.sun.opengl.impl; +import java.lang.reflect.InvocationTargetException; + /** Singleton thread upon which all OpenGL work is performed by default. Unfortunately many vendors' OpenGL drivers are not really thread-safe and stability is much improved by performing OpenGL @@ -55,6 +57,7 @@ public class GLWorkerThread { private static volatile Thread thread; private static Object lock; private static volatile boolean shouldTerminate; + private static volatile Throwable exception; // The Runnable to execute on the worker thread -- no need for a // queue since we don't have an invokeLater() primitive @@ -85,7 +88,8 @@ public class GLWorkerThread { } } - public static void invokeAndWait(Runnable runnable) { + public static void invokeAndWait(Runnable runnable) + throws InvocationTargetException, InterruptedException { if (!started) { throw new RuntimeException("May not invokeAndWait on worker thread without starting it first"); } @@ -103,10 +107,9 @@ public class GLWorkerThread { work = runnable; lock.notifyAll(); - try { - lock.wait(); - } catch (InterruptedException e) { - throw new RuntimeException(e); + lock.wait(); + if (exception != null) { + throw new InvocationTargetException(exception); } } } @@ -145,9 +148,14 @@ public class GLWorkerThread { return; } - work.run(); - work = null; - lock.notifyAll(); + try { + work.run(); + } catch (Throwable t) { + exception = t; + } finally { + work = null; + lock.notifyAll(); + } } } } diff --git a/src/classes/javax/media/opengl/Threading.java b/src/classes/javax/media/opengl/Threading.java index 2f1aa4fb7..7aa57def5 100755 --- a/src/classes/javax/media/opengl/Threading.java +++ b/src/classes/javax/media/opengl/Threading.java @@ -250,7 +250,13 @@ public class Threading { } } } - GLWorkerThread.invokeAndWait(r); + try { + GLWorkerThread.invokeAndWait(r); + } catch (InvocationTargetException e) { + throw new GLException(e.getTargetException()); + } catch (InterruptedException e) { + throw new GLException(e); + } break; default: |