JAL-1645 Version-Rel Version 2.9 Year-Rel 2015 Licensing glob
[jalview.git] / src / jalview / javascript / JSFunctionExec.java
index 6ab0865..6202cba 100644 (file)
@@ -1,41 +1,85 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9)
+ * Copyright (C) 2015 The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.javascript;
 
+import jalview.bin.JalviewLite;
+
 import java.net.URL;
 import java.util.Vector;
 
-import netscape.javascript.JSException;
 import netscape.javascript.JSObject;
-import jalview.bin.JalviewLite;
 
 public class JSFunctionExec implements Runnable
 {
-  JalviewLite jvlite;
+  public JalviewLite jvlite;
 
   public JSFunctionExec(JalviewLite applet)
   {
     jvlite = applet;
+
+    jsExecQueue = jvlite.getJsExecQueue();
+    jvlite.setExecutor(this);
   }
 
-  private static Vector jsExecQueue;
+  public void finalize()
+  {
+    jvlite = null;
+    executor = null;
+    if (jsExecQueue != null)
+    {
+      jsExecQueue.clear();
+    }
+    jsExecQueue = null;
+  }
 
-  private static Thread executor = null;
+  private Vector jsExecQueue;
 
-  public static void stopQueue()
+  private Thread executor = null;
+
+  public void stopQueue()
   {
     if (jsExecQueue != null)
     {
+      Vector<JSFunctionExec> q = null;
       synchronized (jsExecQueue)
       {
-        Vector q = jsExecQueue;
-        q.removeAllElements();
+        q = jsExecQueue;
         jsExecQueue = null;
+      }
+      if (q != null)
+      {
+        for (JSFunctionExec jx : q)
+        {
+          jx.jvlite = null;
+
+        }
+        q.removeAllElements();
         synchronized (q)
         {
           q.notifyAll();
         }
       }
-      executor = null;
     }
+    jvlite = null;
+    executor = null;
   }
 
   public void run()
@@ -75,7 +119,7 @@ public class JSFunctionExec implements Runnable
   }
 
   /**
-   * execute a javascript callback asynchronously
+   * execute a javascript callback synchronously
    * 
    * @param _listener
    * @param objects
@@ -149,7 +193,8 @@ public class JSFunctionExec implements Runnable
             {
               System.err.println(jex);
             }
-            if (jex instanceof netscape.javascript.JSException)
+            if (jex instanceof netscape.javascript.JSException
+                    && jvlite.jsfallbackEnabled)
             {
               jsex[0] = (netscape.javascript.JSException) jex;
               if (jvlite.debug)
@@ -211,10 +256,9 @@ public class JSFunctionExec implements Runnable
     };
     if (async)
     {
-      if (JSFunctionExec.executor == null)
+      if (executor == null)
       {
-        JSFunctionExec.jsExecQueue = new Vector();
-        JSFunctionExec.executor = new Thread(new JSFunctionExec(jvlite));
+        executor = new Thread(new JSFunctionExec(jvlite));
         executor.start();
       }
       synchronized (jsExecQueue)
@@ -225,6 +269,7 @@ public class JSFunctionExec implements Runnable
     }
     else
     {
+      // wat for executor to notify us if it's running.
       exec.run();
       if (jsex[0] != null)
       {