You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ed...@apache.org on 2008/11/10 14:05:45 UTC
svn commit: r712656 -
/mina/trunk/core/src/main/java/org/apache/mina/proxy/event/IoSessionEventQueue.java
Author: edeoliveira
Date: Mon Nov 10 05:05:45 2008
New Revision: 712656
URL: http://svn.apache.org/viewvc?rev=712656&view=rev
Log:
Improved concurrency and added javadoc
Modified:
mina/trunk/core/src/main/java/org/apache/mina/proxy/event/IoSessionEventQueue.java
Modified: mina/trunk/core/src/main/java/org/apache/mina/proxy/event/IoSessionEventQueue.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/proxy/event/IoSessionEventQueue.java?rev=712656&r1=712655&r2=712656&view=diff
==============================================================================
--- mina/trunk/core/src/main/java/org/apache/mina/proxy/event/IoSessionEventQueue.java (original)
+++ mina/trunk/core/src/main/java/org/apache/mina/proxy/event/IoSessionEventQueue.java Mon Nov 10 05:05:45 2008
@@ -28,7 +28,8 @@
import org.slf4j.LoggerFactory;
/**
- * IoSessionEventQueue.java - Queue that contains filtered session events while handshake isn't done.
+ * IoSessionEventQueue.java - Queue that contains filtered session events
+ * while handshake isn't done.
*
* @author The Apache MINA Project (dev@mina.apache.org)
* @version $Rev$, $Date$
@@ -43,23 +44,35 @@
/**
* Queue of session events which occurred before the proxy handshake had completed.
*/
- private Queue<IoSessionEvent> sessionEventsQueue = null;
+ private Queue<IoSessionEvent> sessionEventsQueue = new LinkedList<IoSessionEvent>();
public IoSessionEventQueue(ProxyIoSession proxyIoSession) {
this.proxyIoSession = proxyIoSession;
}
- private void freeSessionQueue() {
- logger.debug("Event queue CLEARED");
-
- // Free queue
- sessionEventsQueue = null;
+ /**
+ * Discard all events from the queue.
+ */
+ private void discardSessionQueueEvents() {
+ synchronized (sessionEventsQueue) {
+ // Free queue
+ sessionEventsQueue.clear();
+ logger.debug("Event queue CLEARED");
+ }
}
/**
- * Event is enqueued only if necessary.
+ * Event is enqueued only if necessary :
+ * - socks proxies do not need the reconnection feature so events are always
+ * forwarded for these.
+ * - http proxies events will be enqueued while handshake has not been completed
+ * or until connection was closed.
+ * If connection was prematurely closed previous events are discarded and only the
+ * session closed is delivered.
+ *
+ * @param evt the event to enqueue
*/
- public synchronized void enqueueEventIfNecessary(final IoSessionEvent evt) {
+ public void enqueueEventIfNecessary(final IoSessionEvent evt) {
logger.debug("??? >> Enqueue {}", evt);
if (proxyIoSession.getRequest() instanceof SocksProxyRequest) {
@@ -74,13 +87,14 @@
if (evt.getType() == IoSessionEventType.CLOSED) {
if (proxyIoSession.isAuthenticationFailed()) {
proxyIoSession.getConnector().cancelConnectFuture();
- freeSessionQueue();
+ discardSessionQueueEvents();
evt.deliverEvent();
} else {
- freeSessionQueue();
+ discardSessionQueueEvents();
}
} else if (evt.getType() == IoSessionEventType.OPENED) {
- // Enqueue event cause it will not reach IoHandler but deliver it to enable session creation.
+ // Enqueue event cause it will not reach IoHandler but deliver it to enable
+ // session creation.
enqueueSessionEvent(evt);
evt.deliverEvent();
} else {
@@ -90,39 +104,30 @@
}
/**
- * Send any session event which were queued whilst waiting for handshaking to complete.
+ * Send any session event which were queued while waiting for handshaking to complete.
*
* Please note this is an internal method. DO NOT USE it in your code.
*/
- public synchronized void flushPendingSessionEvents() throws Exception {
- IoSessionEvent evt;
-
- logger.debug(" flushPendingSessionEvents()");
-
- if (sessionEventsQueue == null) {
- return;
- }
-
- while ((evt = sessionEventsQueue.poll()) != null) {
- logger.debug(" Flushing buffered event: {}", evt);
-
- evt.deliverEvent();
+ public void flushPendingSessionEvents() throws Exception {
+ synchronized (sessionEventsQueue) {
+ IoSessionEvent evt;
+
+ while ((evt = sessionEventsQueue.poll()) != null) {
+ logger.debug(" Flushing buffered event: {}", evt);
+ evt.deliverEvent();
+ }
}
-
- // Free queue
- sessionEventsQueue = null;
}
/**
* Enqueue an event to be delivered once handshaking is complete.
+ *
+ * @param evt the session event to enqueue
*/
private void enqueueSessionEvent(final IoSessionEvent evt) {
- if (sessionEventsQueue == null) {
- sessionEventsQueue = new LinkedList<IoSessionEvent>();
- }
-
- logger.debug("Enqueuing event: {}", evt);
-
- sessionEventsQueue.offer(evt);
+ synchronized (sessionEventsQueue) {
+ logger.debug("Enqueuing event: {}", evt);
+ sessionEventsQueue.offer(evt);
+ }
}
}
\ No newline at end of file