Author: remm Date: Thu Mar 16 09:50:37 2006 New Revision: 386404 URL: http://svn.apache.org/viewcvs?rev=386404&view=rev Log: - Expand a bit the semaphore valve.
Modified: tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/valves/SemaphoreValve.java Modified: tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/valves/SemaphoreValve.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/valves/SemaphoreValve.java?rev=386404&r1=386403&r2=386404&view=diff ============================================================================== --- tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/valves/SemaphoreValve.java (original) +++ tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/valves/SemaphoreValve.java Thu Mar 16 09:50:37 2006 @@ -101,6 +101,22 @@ public void setFairness(boolean fairness) { this.fairness = fairness; } + /** + * Block until a permit is available. + */ + protected boolean block = true; + public boolean getBlock() { return block; } + public void setBlock(boolean block) { this.block = block; } + + + /** + * Block interruptibly until a permit is available. + */ + protected boolean interruptible = false; + public boolean getInterruptible() { return interruptible; } + public void setInterruptible(boolean interruptible) { this.interruptible = interruptible; } + + // ------------------------------------------------------ Lifecycle Methods @@ -206,15 +222,55 @@ public void invoke(Request request, Response response) throws IOException, ServletException { - try { - semaphore.acquireUninterruptibly(); - // Perform the request + if (controlConcurrency(request, response)) { + boolean shouldRelease = true; + try { + if (block) { + if (interruptible) { + try { + semaphore.acquire(); + } catch (InterruptedException e) { + shouldRelease = false; + permitDenied(request, response); + return; + } + } else { + semaphore.acquireUninterruptibly(); + } + } else { + if (!semaphore.tryAcquire()) { + shouldRelease = false; + permitDenied(request, response); + return; + } + } + getNext().invoke(request, response); + } finally { + if (shouldRelease) { + semaphore.release(); + } + } + } else { getNext().invoke(request, response); - } finally { - semaphore.release(); } } + + /** + * Subclass friendly method to add conditions. + */ + public boolean controlConcurrency(Request request, Response response) { + return true; + } + + + /** + * Subclass friendly method to add error handling when a permit isn't granted. + */ + public void permitDenied(Request request, Response response) + throws IOException, ServletException { + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]