home *** CD-ROM | disk | FTP | other *** search
- package netscape.applet;
-
- class AppletThreadKiller implements Runnable {
- AppletThreadList list = new AppletThreadList();
- Thread[] threadsSnapshot;
- int threadsSnapshotLen;
- boolean keepRunning = true;
- static ThreadGroup clientThreadGroup;
- static final int SHUTDOWN_TIMEOUT = 30000;
-
- AppletThreadKiller() {
- SecurityManager.enablePrivilege("UniversalThreadGroupAccess");
- clientThreadGroup = new ThreadGroup("ClientThreadGroup");
- Thread var1 = new Thread(this, "Applet Thread Killer");
- var1.start();
- }
-
- synchronized void addAppletThread(AppletThreadList var1) {
- this.list.appendElement(var1);
- this.notify();
- }
-
- synchronized AppletThreadList getAppletThread() {
- AppletThreadList var1 = null;
-
- while(this.keepRunning && this.list.isEmptyList()) {
- try {
- this.wait();
- } catch (InterruptedException var2) {
- }
- }
-
- if (!this.list.isEmptyList()) {
- var1 = (AppletThreadList)this.list.next;
- ((DoubleLinkedList)var1).remove();
- }
-
- return var1;
- }
-
- synchronized boolean shutdown() {
- if (MozillaAppletContext.debug >= 7) {
- System.out.println("##### shutting down all applets");
- }
-
- this.keepRunning = false;
- this.notify();
-
- try {
- this.wait((long)(30000 * (MozillaAppletContext.totalApplets + 1)));
- } catch (InterruptedException var2) {
- if (MozillaAppletContext.debug >= 7) {
- System.out.println("##### applets shutdown interrupted: " + var2);
- }
- }
-
- boolean var1 = clientThreadGroup.activeCount() == 0;
- if (MozillaAppletContext.debug >= 7) {
- System.out.println("##### applets shutdown complete: " + (var1 ? "successful" : "failed"));
- }
-
- return var1;
- }
-
- public void run() {
- while(this.keepRunning || !this.list.isEmptyList()) {
- try {
- AppletThreadList var1 = this.getAppletThread();
- if (var1 != null) {
- Object var2 = null;
- Object var3 = null;
- MozillaAppletContext var4 = null;
- Object var5 = null;
- ThreadGroup var82 = var1.group;
- DerivedAppletFrame var83 = var1.frame;
- if (var83 != null) {
- var4 = var83.context;
- }
-
- Task var84 = var1.task;
- String var6 = var83 != null ? var83.getAppletName() : var84.taskName();
- synchronized(var82){}
-
- try {
- if (var83 != null) {
- var83.requestShutdown();
- } else {
- var84.requestShutdown();
- }
-
- if (!this.keepRunning) {
- int var9 = var82.activeCount();
- if (this.threadsSnapshot == null || this.threadsSnapshotLen < var9) {
- this.threadsSnapshot = new Thread[var9];
- this.threadsSnapshotLen = var9;
- }
-
- var82.enumerate(this.threadsSnapshot);
-
- for(int var10 = 0; var10 < var9; ++var10) {
- Thread var11 = this.threadsSnapshot[var10];
- if (var11.isDaemon()) {
- var11.stop();
- }
- }
- }
-
- if (var82.activeCount() > 0) {
- try {
- var82.wait(30000L);
- } catch (InterruptedException var76) {
- System.err.println("# Interrupted while waiting for applet to die: " + var6);
- }
- }
-
- if (var82.activeCount() > 0) {
- if (MozillaAppletContext.debug >= 4) {
- System.out.println("# Applet " + var6 + " did not shut down within " + 30 + " seconds -- killing it.");
- }
-
- try {
- SecurityManager.enablePrivilege("UniversalThreadGroupAccess");
- var82.stop();
- var82.wait(5000L);
- } catch (InterruptedException var74) {
- System.err.println("# Interrupted while stopping thread group: " + var6);
- } finally {
- SecurityManager.revertPrivilege();
- }
- }
-
- if (var82.activeCount() > 0) {
- try {
- SecurityManager.enablePrivilege("UniversalThreadGroupAccess");
- var82.destroy();
- } catch (Exception var78) {
- if (MozillaAppletContext.debug >= 7) {
- System.err.println("# Exception while destroying group: " + var6);
- ((Throwable)var78).printStackTrace();
- }
- } finally {
- SecurityManager.revertPrivilege();
- }
- }
-
- if (var83 != null) {
- var83.destroy();
- }
- } catch (Throwable var80) {
- throw var80;
- }
-
- if (var4 != null) {
- synchronized(var4){}
-
- try {
- if (var4.appletFrames != null && var4.appletFrames.isEmpty()) {
- if (MozillaAppletContext.debug >= 7) {
- System.err.println("# destroyApplet: destroying context for contextID " + var4.contextID);
- }
-
- var4.destroy();
- }
- } catch (Throwable var77) {
- throw var77;
- }
- }
- }
- } catch (Exception var81) {
- System.out.println("Exception occurred while destroying applet: " + ((Throwable)var81).toString());
- if (MozillaAppletContext.debug >= 7) {
- ((Throwable)var81).printStackTrace();
- }
- }
- }
-
- try {
- SecurityManager.enablePrivilege("UniversalThreadGroupAccess");
- clientThreadGroup.stop();
- clientThreadGroup.destroy();
- } finally {
- SecurityManager.revertPrivilege();
- }
-
- if (MozillaAppletContext.debug >= 7) {
- System.out.println("# all applets and programs killed");
- }
-
- synchronized(this){}
-
- try {
- this.notify();
- } catch (Throwable var72) {
- throw var72;
- }
-
- }
-
- public String toString() {
- return new String("Applet thread killer! Applets to be disposed: " + this.list);
- }
- }
-