You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by se...@apache.org on 2002/01/10 04:03:59 UTC

cvs commit: jakarta-tomcat-connectors/jk/java/org/apache/ajp/tomcat4 Ajp13Processor.java

seguin      02/01/09 19:03:59

  Modified:    jk/java/org/apache/ajp/tomcat4 Ajp13Processor.java
  Log:
  a quick patch to attempt to shorten shutdown time, plus some
  additional logging.
  
  the idea is simple:  set a flag when the processor is handling
  a request, then when stopping, only wait on the worker
  thread if a request is currently being handled.
  
  this patch won't make a difference if the connector is busy and
  there are a bunch of processors currently handling requests, but
  it will make a difference if the connector is not busy.
  
  Revision  Changes    Path
  1.6       +78 -14    jakarta-tomcat-connectors/jk/java/org/apache/ajp/tomcat4/Ajp13Processor.java
  
  Index: Ajp13Processor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/ajp/tomcat4/Ajp13Processor.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Ajp13Processor.java	20 Dec 2001 17:44:51 -0000	1.5
  +++ Ajp13Processor.java	10 Jan 2002 03:03:59 -0000	1.6
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/ajp/tomcat4/Ajp13Processor.java,v 1.5 2001/12/20 17:44:51 jfclere Exp $
  - * $Revision: 1.5 $
  - * $Date: 2001/12/20 17:44:51 $
  + * $Header: /home/cvs/jakarta-tomcat-connectors/jk/java/org/apache/ajp/tomcat4/Ajp13Processor.java,v 1.6 2002/01/10 03:03:59 seguin Exp $
  + * $Revision: 1.6 $
  + * $Date: 2002/01/10 03:03:59 $
    *
    * ====================================================================
    *
  @@ -102,12 +102,35 @@
   
   /**
    * @author Kevin Seguin
  - * @version $Revision: 1.5 $ $Date: 2001/12/20 17:44:51 $
  + * @version $Revision: 1.6 $ $Date: 2002/01/10 03:03:59 $
    */
   
   final class Ajp13Processor
       implements Lifecycle, Runnable {
   
  +    /**
  +     * A simple class to provide synchronized access
  +     * to a boolean.
  +     */
  +    private class Bool {
  +
  +        private boolean b = false;
  +
  +        Bool() {
  +        }
  +        
  +        Bool(boolean b) {
  +            this.b = b;
  +        }
  +
  +        synchronized boolean value() {
  +            return b;
  +        }
  +
  +        synchronized void set(boolean b) {
  +            this.b = b;
  +        }
  +    }
   
       // ----------------------------------------------------------- Constructors
   
  @@ -207,7 +230,12 @@
       /**
        * The shutdown signal to our background thread
        */
  -    private boolean stopped = false;
  +    private Bool stopped = new Bool(true);
  +
  +    /**
  +     * Are we currently handling a request?
  +     */
  +    private Bool handlingRequest = new Bool(false);
   
   
       /**
  @@ -256,7 +284,7 @@
   	available = true;
   	notifyAll();
   
  -	if ((debug >= 1) && (socket != null))
  +	if ((debug > 0) && (socket != null))
   	    logger.log(" An incoming request is being assigned");
   
       }
  @@ -284,7 +312,7 @@
   	available = false;
   	notifyAll();
   
  -	if ((debug >= 1) && (socket != null))
  +	if ((debug > 0) && (socket != null))
   	    logger.log("  The incoming request has been awaited");
   
   	return (socket);
  @@ -332,7 +360,7 @@
           }
   
           boolean moreRequests = true;
  -        while (moreRequests) {
  +        while (moreRequests && !stopped.value()) {
               
               int status = 0;
               try {
  @@ -340,6 +368,13 @@
               } catch (IOException e) {
                   logger.log("process: ajp13.receiveNextRequest", e);
               }
  +
  +            if (stopped.value()) {
  +                if (debug > 0) {
  +                    logger.log("process:  received request, but we're stopped");
  +                }
  +                break;
  +            }
               
               if( status==-2) {
                   // special case - shutdown
  @@ -356,6 +391,9 @@
                   break;
   
               try {
  +                // set flag
  +                handlingRequest.set(true);
  +                
                   // set up request
                   request.setAjpRequest(ajpRequest);
                   request.setResponse(response);
  @@ -365,14 +403,23 @@
                   response.setRequest(request);
                   response.setStream(output);
                   
  -                if (this.debug > 0) {
  +                if (debug > 0) {
                       logger.log("invoking...");
                   }
  +
                   connector.getContainer().invoke(request, response);
   
  +                if (debug > 0) {
  +                    logger.log("done invoking, finishing request/response....");
  +                }
  +
                   response.finishResponse();
                   request.finishRequest();
   
  +                if (debug > 0) {
  +                    logger.log("finished handling request.");
  +                }
  +
               } catch (Exception e) {
                   logger.log("process: invoke", e);
               }
  @@ -384,6 +431,9 @@
   
               // recycle ajp13 object
               ajp13.recycle();
  +
  +            // reset flag
  +            handlingRequest.set(false);
           }
           
   	try {
  @@ -399,7 +449,9 @@
   	}
   	socket = null;
   
  -        logger.log("process:  done");
  +        if (debug > 0) {
  +            logger.log("process:  done");
  +        }
       }
   
   
  @@ -413,7 +465,7 @@
       public void run() {
   
           // Process requests until we receive a shutdown signal
  -	while (!stopped) {
  +	while (!stopped.value()) {
   
   	    // Wait for the next socket to be assigned
   	    Socket socket = await();
  @@ -443,11 +495,12 @@
   
   	logger.log(sm.getString("ajp13Processor.starting"));
   
  +        stopped.set(false);
   	thread = new Thread(this, threadName);
   	thread.setDaemon(true);
   	thread.start();
   
  -	if (debug >= 1)
  +	if (debug > 0)
   	    logger.log(" Background thread has been started");
   
       }
  @@ -460,11 +513,22 @@
   
   	logger.log(sm.getString("ajp13Processor.stopping"));
   
  -	stopped = true;
  +	stopped.set(true);
           assign(null);
   	synchronized (threadSync) {
   	    try {
  -		threadSync.wait(5000);
  +                if (handlingRequest.value()) {
  +                    if (debug > 0) {
  +                        logger.log
  +                            ("currentling handling a request, so waiting....");
  +                    }
  +                    threadSync.wait(5000);
  +                } else {
  +                    if (debug > 0) {
  +                        logger.log
  +                            ("not currently handling a request, not waiting.");
  +                    }
  +                }
   	    } catch (InterruptedException e) {
   		;
   	    }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>