home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 June / pcx11_9706.iso / shutils / internet / browser / p32e40b5.exe / nav40.z / java40.jar / netscape / applet / AppletThreadKiller.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-05-23  |  4.2 KB  |  198 lines

  1. package netscape.applet;
  2.  
  3. class AppletThreadKiller implements Runnable {
  4.    AppletThreadList list = new AppletThreadList();
  5.    Thread[] threadsSnapshot;
  6.    int threadsSnapshotLen;
  7.    boolean keepRunning = true;
  8.    static ThreadGroup clientThreadGroup;
  9.    static final int SHUTDOWN_TIMEOUT = 30000;
  10.  
  11.    AppletThreadKiller() {
  12.       clientThreadGroup = new ThreadGroup("ClientThreadGroup");
  13.       Thread var1 = new Thread(this, "Applet Thread Killer");
  14.       var1.start();
  15.    }
  16.  
  17.    synchronized void addAppletThread(AppletThreadList var1) {
  18.       this.list.appendElement(var1);
  19.       this.notify();
  20.    }
  21.  
  22.    synchronized AppletThreadList getAppletThread() {
  23.       AppletThreadList var1 = null;
  24.  
  25.       while(this.keepRunning && this.list.isEmptyList()) {
  26.          try {
  27.             this.wait();
  28.          } catch (InterruptedException var2) {
  29.          }
  30.       }
  31.  
  32.       if (!this.list.isEmptyList()) {
  33.          var1 = (AppletThreadList)this.list.next;
  34.          ((DoubleLinkedList)var1).remove();
  35.       }
  36.  
  37.       return var1;
  38.    }
  39.  
  40.    synchronized boolean shutdown() {
  41.       if (MozillaAppletContext.debug > 0) {
  42.          System.out.println("##### shutting down all applets");
  43.       }
  44.  
  45.       this.keepRunning = false;
  46.       this.notify();
  47.  
  48.       try {
  49.          this.wait((long)(30000 * (MozillaAppletContext.totalApplets + 1)));
  50.       } catch (InterruptedException var2) {
  51.          if (MozillaAppletContext.debug > 0) {
  52.             System.out.println("##### applets shutdown interrupted: " + var2);
  53.          }
  54.       }
  55.  
  56.       boolean var1 = clientThreadGroup.activeCount() == 0;
  57.       if (MozillaAppletContext.debug > 0) {
  58.          System.out.println("##### applets shutdown complete: " + (var1 ? "successful" : "failed"));
  59.       }
  60.  
  61.       return var1;
  62.    }
  63.  
  64.    public void run() {
  65.       while(this.keepRunning || !this.list.isEmptyList()) {
  66.          try {
  67.             AppletThreadList var1 = this.getAppletThread();
  68.             if (var1 != null) {
  69.                Object var2 = null;
  70.                Object var3 = null;
  71.                MozillaAppletContext var4 = null;
  72.                Object var5 = null;
  73.                ThreadGroup var82 = var1.group;
  74.                DerivedAppletFrame var83 = var1.frame;
  75.                if (var83 != null) {
  76.                   var4 = var83.context;
  77.                }
  78.  
  79.                Task var84 = var1.task;
  80.                String var6 = var83 != null ? var83.getAppletName() : var84.taskName();
  81.                synchronized(var82){}
  82.  
  83.                try {
  84.                   if (var83 != null) {
  85.                      var83.requestShutdown();
  86.                   } else {
  87.                      var84.requestShutdown();
  88.                   }
  89.  
  90.                   if (!this.keepRunning) {
  91.                      int var9 = var82.activeCount();
  92.                      if (this.threadsSnapshot == null || this.threadsSnapshotLen < var9) {
  93.                         this.threadsSnapshot = new Thread[var9];
  94.                         this.threadsSnapshotLen = var9;
  95.                      }
  96.  
  97.                      var82.enumerate(this.threadsSnapshot);
  98.  
  99.                      for(int var10 = 0; var10 < var9; ++var10) {
  100.                         Thread var11 = this.threadsSnapshot[var10];
  101.                         if (var11.isDaemon()) {
  102.                            var11.stop();
  103.                         }
  104.                      }
  105.                   }
  106.  
  107.                   try {
  108.                      var82.wait(30000L);
  109.                   } catch (InterruptedException var76) {
  110.                      System.err.println("# Interrupted while waiting for applet to die: " + var6);
  111.                   }
  112.  
  113.                   if (var82.activeCount() > 0) {
  114.                      if (MozillaAppletContext.debug > 0) {
  115.                         System.out.println("# Applet " + var6 + " did not shut down within " + 30 + " seconds -- killing it.");
  116.                      }
  117.  
  118.                      try {
  119.                         SecurityManager.enablePrivilege("UniversalThreadGroupAccess");
  120.                         var82.stop();
  121.                         var82.wait(5000L);
  122.                      } catch (InterruptedException var74) {
  123.                         System.err.println("# Interrupted while stopping thread group: " + var6);
  124.                      } finally {
  125.                         SecurityManager.revertPrivilege();
  126.                      }
  127.                   }
  128.  
  129.                   try {
  130.                      SecurityManager.enablePrivilege("UniversalThreadGroupAccess");
  131.                      var82.destroy();
  132.                   } catch (Exception var78) {
  133.                      if (MozillaAppletContext.debug > 0) {
  134.                         System.err.println("# Exception while destroying group: " + var6);
  135.                         ((Throwable)var78).printStackTrace();
  136.                      }
  137.                   } finally {
  138.                      SecurityManager.revertPrivilege();
  139.                   }
  140.  
  141.                   if (var83 != null) {
  142.                      var83.destroy();
  143.                   }
  144.                } catch (Throwable var80) {
  145.                   throw var80;
  146.                }
  147.  
  148.                if (var4 != null) {
  149.                   synchronized(var4){}
  150.  
  151.                   try {
  152.                      if (var4.appletFrames != null && var4.appletFrames.isEmpty()) {
  153.                         if (MozillaAppletContext.debug > 0) {
  154.                            System.err.println("#   destroyApplet: destroying context for contextID " + var4.contextID);
  155.                         }
  156.  
  157.                         var4.destroy();
  158.                      }
  159.                   } catch (Throwable var77) {
  160.                      throw var77;
  161.                   }
  162.                }
  163.             }
  164.          } catch (Exception var81) {
  165.             System.out.println("Exception occurred while destroying applet: " + ((Throwable)var81).toString());
  166.             if (MozillaAppletContext.debug > 0) {
  167.                ((Throwable)var81).printStackTrace();
  168.             }
  169.          }
  170.       }
  171.  
  172.       try {
  173.          SecurityManager.enablePrivilege("UniversalThreadGroupAccess");
  174.          clientThreadGroup.stop();
  175.          clientThreadGroup.destroy();
  176.       } finally {
  177.          SecurityManager.revertPrivilege();
  178.       }
  179.  
  180.       if (MozillaAppletContext.debug > 0) {
  181.          System.out.println("# all applets and programs killed");
  182.       }
  183.  
  184.       synchronized(this){}
  185.  
  186.       try {
  187.          this.notify();
  188.       } catch (Throwable var72) {
  189.          throw var72;
  190.       }
  191.  
  192.    }
  193.  
  194.    public String toString() {
  195.       return new String("Applet thread killer! Applets to be disposed: " + this.list);
  196.    }
  197. }
  198.