You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by re...@apache.org on 2006/03/16 18:50:48 UTC
svn commit: r386404 -
/tomcat/container/tc5.5.x/catalina/src/share/org/apache/catalina/valves/SemaphoreValve.java
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: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org