Author: fhanik
Date: Thu May 24 08:47:29 2007
New Revision: 541337
URL: http://svn.apache.org/viewvc?view=rev&rev=541337
Log:
Add in support to check if the current thread is a Tomcat 'worker' thread or
not, that way we can decide if the invokations are appropriate or not
Modified:
tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java
tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
Modified: tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java?view=diff&rev=541337&r1=541336&r2=541337
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CometEventImpl.java Thu May
24 08:47:29 2007
@@ -19,7 +19,7 @@
package org.apache.catalina.connector;
import java.io.IOException;
-
+import java.util.HashSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -29,7 +29,6 @@
public class CometEventImpl implements CometEvent {
-
/**
* The string manager for this package.
*/
@@ -69,7 +68,14 @@
*/
protected EventSubType eventSubType = null;
+ /**
+ * Current set of operations
+ */
+ protected HashSet<CometOperation> cometOperations = new
HashSet<CometOperation>(3);
+
+ protected WorkerThreadCheck threadCheck = new WorkerThreadCheck();
+ private static final Object threadCheckHolder = new Object();
// --------------------------------------------------------- Public Methods
/**
@@ -136,7 +142,13 @@
public void register(CometEvent.CometOperation... operations)
throws IOException, IllegalStateException {
- throw new UnsupportedOperationException();
+ //add it to the registered set
+ for (CometEvent.CometOperation co : operations ) {
+ if ( !cometOperations.contains(co) ) {
+ cometOperations.add(co);
+ //TODO notify poller
+ }
+ }
}
public void unregister(CometOperation... operations)
@@ -150,6 +162,25 @@
public CometOperation[] getRegisteredOps() {
throw new UnsupportedOperationException();
+ }
+
+ protected void setWorkerThread() {
+ threadCheck.set(threadCheckHolder);
+ }
+
+ protected void unsetWorkerThread() {
+ threadCheck.set(null);
+ }
+
+ protected void checkWorkerThread() throws IllegalStateException {
+ //throw exception if not on worker thread
+ if ( !(threadCheck.get() == threadCheckHolder) )
+ throw new IllegalStateException("The operation can only be
performed when invoked by a Tomcat worker thread.");
+ }
+
+ //inner class used to keep track if the current thread is a worker thread.
+ private static class WorkerThreadCheck extends ThreadLocal {
+
}
}
Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?view=diff&rev=541337&r1=541336&r2=541337
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Thu May
24 08:47:29 2007
@@ -119,7 +119,10 @@
boolean error = false;
boolean read = false;
+ CometEvent event = request.getEvent();
try {
+ if ( event!=null && (event instanceof CometEventImpl))
+ ((CometEventImpl)event).setWorkerThread();
if (status == SocketStatus.OPEN) {
if (response.isClosed()) {
// The event has been closed asynchronously, so call
end instead of
@@ -198,6 +201,9 @@
error = true;
return false;
} finally {
+ if ( event!=null && (event instanceof CometEventImpl))
+ ((CometEventImpl)event).unsetWorkerThread();
+
req.getRequestProcessor().setWorkerThreadName(null);
// Recycle the wrapper request and response
if (error || response.isClosed() || !request.isComet()) {
@@ -250,7 +256,7 @@
}
boolean comet = false;
-
+ CometEvent event = null;
try {
// Parse and set Catalina and configuration specific
@@ -261,6 +267,10 @@
connector.getContainer().getPipeline().getFirst().invoke(request, response);
if (request.isComet()) {
+ event = request.getEvent();
+ if ( event!=null && (event instanceof CometEventImpl))
+ ((CometEventImpl)event).setWorkerThread();
+
if (!response.isClosed() && !response.isError()) {
if (request.getAvailable()) {
// Invoke a read event right away if there are
available bytes
@@ -291,6 +301,9 @@
} catch (Throwable t) {
log.error(sm.getString("coyoteAdapter.service"), t);
} finally {
+ if ( event!=null && (event instanceof CometEventImpl))
+ ((CometEventImpl)event).unsetWorkerThread();
+
req.getRequestProcessor().setWorkerThreadName(null);
// Recycle the wrapper request and response
if (!comet) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]