Java Mailing List Archive

http://www.junlu.com/

Home » dev.tomcat »

svn commit: r992211 -
/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java

Mladen Turk

2010-09-03


Author LoginPost Reply
Author: mturk
Date: Fri Sep 3 05:27:24 2010
New Revision: 992211

URL: http://svn.apache.org/viewvc?rev=992211&view=rev
Log:
Join poller and sendfile threads on destroy. This requires to change the Poller and Sendile to Thread instead Runnable for simplicity.

Modified:
  tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=992211&r1=992210&r2=992211&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Fri Sep 3 05:27:24 2010
@@(protected)
        for (int i = 0; i < pollerThreadCount; i++) {
          pollers[i] = new Poller(false);
          pollers[i].init();
-           Thread pollerThread = new Thread(pollers[i], getName() + "-Poller-" + i);
-           pollerThread.setPriority(threadPriority);
-           pollerThread.setDaemon(true);
-           pollerThread.start();
+           pollers[i].setName(getName() + "-Poller-" + i);
+           pollers[i].setPriority(threadPriority);
+           pollers[i].setDaemon(true);
+           pollers[i].start();
        }

        // Start comet poller threads
@@(protected)
        for (int i = 0; i < pollerThreadCount; i++) {
          cometPollers[i] = new Poller(true);
          cometPollers[i].init();
-           Thread pollerThread = new Thread(cometPollers[i], getName() + "-CometPoller-" + i);
-           pollerThread.setPriority(threadPriority);
-           pollerThread.setDaemon(true);
-           pollerThread.start();
+           cometPollers[i].setName(getName() + "-CometPoller-" + i);
+           cometPollers[i].setPriority(threadPriority);
+           cometPollers[i].setDaemon(true);
+           cometPollers[i].start();
        }

        // Start sendfile threads
@@(protected)
          for (int i = 0; i < sendfileThreadCount; i++) {
             sendfiles[i] = new Sendfile();
             sendfiles[i].init();
-             Thread sendfileThread = new Thread(sendfiles[i], getName() + "-Sendfile-" + i);
-             sendfileThread.setPriority(threadPriority);
-             sendfileThread.setDaemon(true);
-             sendfileThread.start();
+             sendfiles[i].setName(getName() + "-Sendfile-" + i);
+             sendfiles[i].setPriority(threadPriority);
+             sendfiles[i].setDaemon(true);
+             sendfiles[i].start();
          }
        }

@@(protected)
        acceptors = new Acceptor[acceptorThreadCount];
        for (int i = 0; i < acceptorThreadCount; i++) {
          acceptors[i] = new Acceptor();
-           Thread acceptorThread = new Thread(acceptors[i], getName() + "-Acceptor-" + i);
-           acceptorThread.setPriority(threadPriority);
-           acceptorThread.setDaemon(getDaemon());
-           acceptorThread.start();
+           acceptors[i].setName(getName() + "-Acceptor-" + i);
+           acceptors[i].setPriority(threadPriority);
+           acceptors[i].setDaemon(getDaemon());
+           acceptors[i].start();
        }

     }
@@(protected)
     if (running) {
        running = false;
        unlockAccept();
+        for (int i = 0; i < acceptors.length; i++) {
+           if (acceptors[i].isAlive()) {
+             try {
+                acceptors[i].interrupt();
+                acceptors[i].join();
+             } catch (InterruptedException e) {
+                // Ignore
+             }
+           }
+        }
        // Wait for polltime before doing anything, so that the poller threads
        // exit, otherwise parallel destruction of sockets which are still
        // in the poller can cause problems
@@(protected)
        }
        for (int i = 0; i < pollers.length; i++) {
          pollers[i].destroy();
+           try {
+             pollers[i].interrupt();
+             pollers[i].join();
+           } catch (InterruptedException e) {
+                // Ignore
+           }
        }
        pollers = null;
        for (int i = 0; i < cometPollers.length; i++) {
          cometPollers[i].destroy();
+           try {
+             cometPollers[i].interrupt();
+             cometPollers[i].join();
+           } catch (InterruptedException e) {
+                // Ignore
+           }
        }
        cometPollers = null;
        if (useSendfile) {
          for (int i = 0; i < sendfiles.length; i++) {
             sendfiles[i].destroy();
+             try {
+                sendfiles[i].interrupt();
+                sendfiles[i].join();
+             } catch (InterruptedException e) {
+                // Ignore
+             }
          }
          sendfiles = null;
        }
-        // Wait another polltime to make sure everything is shutdown else
-        // the JVM will crash when we terminate the APR library
-        try {
-           synchronized (this) {
-             this.wait(pollTime / 1000);
-           }
-        } catch (InterruptedException e) {
-           // Ignore
-        }
     }
     shutdownExecutor();
  }
@@(protected)
  /**
   * Server socket acceptor thread.
   */
-   protected class Acceptor implements Runnable {
+   protected class Acceptor extends Thread {


     /**
@@(protected)
  /**
   * Poller class.
   */
-   public class Poller implements Runnable {
+   public class Poller extends Thread {

     protected long serverPollset = 0;
     protected long pool = 0;
@@(protected)
     /**
      * Destroy the poller.
      */
-     protected void destroy() {
+     public void destroy() {
        // Close all sockets in the add queue
        for (int i = 0; i < addCount; i++) {
          if (comet) {
@@(protected)
  /**
   * Sendfile class.
   */
-   public class Sendfile implements Runnable {
+   public class Sendfile extends Thread {

     protected long sendfilePollset = 0;
     protected long pool = 0;
@@(protected)
     /**
      * Destroy the poller.
      */
-     protected void destroy() {
+     public void destroy() {
        // Close any socket remaining in the add queue
        addCount = 0;
        for (int i = (addS.size() - 1); i >= 0; i--) {



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@(protected)
For additional commands, e-mail: dev-help@(protected)

©2008 junlu.com - Jax Systems, LLC, U.S.A.