diff options
author | wimba.com <wimba.com@3789f03b-4d11-0410-bbf8-ca57d06f2519> | 2004-11-01 16:18:54 +0000 |
---|---|---|
committer | wimba.com <wimba.com@3789f03b-4d11-0410-bbf8-ca57d06f2519> | 2004-11-01 16:18:54 +0000 |
commit | d1f56df0b2bdec5da320f5478fbf3c646685db1e (patch) | |
tree | 799f314b793795a5a8a724fd6305d97169819ed6 /java/src | |
parent | 93cc0db437d00f7ffa8886368f1e4085837dcf5a (diff) | |
download | tigervnc-d1f56df0b2bdec5da320f5478fbf3c646685db1e.tar.gz tigervnc-d1f56df0b2bdec5da320f5478fbf3c646685db1e.zip |
Fix RfbPlayer so that it shuts down more orderly. prevents a
crash with certain jvm versions under Win IE.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2538 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/com/tightvnc/rfbplayer/FbsInputStream.java | 13 | ||||
-rw-r--r-- | java/src/com/tightvnc/rfbplayer/RfbPlayer.java | 12 | ||||
-rw-r--r-- | java/src/com/tightvnc/rfbplayer/RfbProto.java | 10 |
3 files changed, 30 insertions, 5 deletions
diff --git a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java index 5547c3c7..6df38ddf 100644 --- a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java +++ b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java @@ -34,6 +34,7 @@ class FbsInputStream extends InputStream { protected long seekOffset; protected boolean seekBackwards; protected boolean paused; + protected boolean isQuitting = false; protected double playbackSpeed; protected byte[] buffer; @@ -76,6 +77,14 @@ class FbsInputStream extends InputStream { bufferPos = 0; } + // Force stream to finish any wait. + public void quit() { + isQuitting = true; + synchronized(this) { + notify(); + } + } + // // Basic methods overriding InputStream's methods. // @@ -202,7 +211,7 @@ class FbsInputStream extends InputStream { } } - while (true) { + while (!isQuitting) { long timeDiff = startTime + timeOffset - System.currentTimeMillis(); if (timeDiff <= 0) { break; @@ -221,7 +230,7 @@ class FbsInputStream extends InputStream { // In paused mode, wait for external notification on this object. // private void waitWhilePaused() { - while (paused && !isSeeking()) { + while (paused && !isSeeking() && !isQuitting) { synchronized(this) { try { // Note: we call Observer.update(Observable,Object) method diff --git a/java/src/com/tightvnc/rfbplayer/RfbPlayer.java b/java/src/com/tightvnc/rfbplayer/RfbPlayer.java index 4b748890..490b2bc0 100644 --- a/java/src/com/tightvnc/rfbplayer/RfbPlayer.java +++ b/java/src/com/tightvnc/rfbplayer/RfbPlayer.java @@ -68,6 +68,7 @@ public class RfbPlayer extends java.applet.Applet double playbackSpeed; boolean autoPlay; boolean showControls; + boolean isQuitting = false; int deferScreenUpdates; // @@ -93,7 +94,7 @@ public class RfbPlayer extends java.applet.Applet if (inSeparateFrame) vncFrame.addWindowListener(this); - rfbThread = new Thread(this); + rfbThread = new Thread(this, "RfbThread"); rfbThread.start(); } @@ -170,7 +171,7 @@ public class RfbPlayer extends java.applet.Applet vc.resizeEmbeddedApplet(); } - while (true) { + while (!isQuitting) { try { setPaused(!autoPlay); rfb.fbs.setSpeed(playbackSpeed); @@ -378,9 +379,14 @@ public class RfbPlayer extends java.applet.Applet // This method is called before the applet is destroyed. // public void destroy() { + isQuitting = true; vncContainer.removeAll(); if (rfb != null) { - rfb = null; + rfb.quit(); + } + try { + rfbThread.join(); + } catch (InterruptedException e) { } if (inSeparateFrame) { vncFrame.dispose(); diff --git a/java/src/com/tightvnc/rfbplayer/RfbProto.java b/java/src/com/tightvnc/rfbplayer/RfbProto.java index 952dc8df..c5af418b 100644 --- a/java/src/com/tightvnc/rfbplayer/RfbProto.java +++ b/java/src/com/tightvnc/rfbplayer/RfbProto.java @@ -80,6 +80,16 @@ class RfbProto { newSession(url); } + // Force processing to quit + public void quit() { + fbs.quit(); + try { + is.close(); + } catch (IOException e) { + System.out.println("IOException quitting RfbProto: " + e); + } + } + // // Open new session URL. // |