Hi Mark,
why didn't you remove the synchronization when you converted the code to
ConcurrentLinkedDeque?
The old code had a concurrency problem, since events.size() was checked
outside of the synchronize block. I think this is not a problem anymore,
but I don't understand the call to events.clear() afterwards the
while-loop in events(). We think we have guarded the queue and removed
all entries by calling pollFirst repeatedly, so why clear it afterwards?
Regards,
Felix
Am 15.09.2015 um 13:11 schrieb ma...@apache.org:
Author: markt
Date: Tue Sep 15 11:11:51 2015
New Revision: 1703151
URL: http://svn.apache.org/r1703151
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=58381
The list of events is accessed by multiple threads so use a thread safe Deque
implementation.
Fix a Javadoc comment
Simplify the code a little
Modified:
tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
Modified:
tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java?rev=1703151&r1=1703150&r2=1703151&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
(original)
+++ tomcat/trunk/java/org/apache/catalina/tribes/transport/nio/NioReceiver.java
Tue Sep 15 11:11:51 2015
@@ -27,9 +27,10 @@ import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
+import java.util.Deque;
import java.util.Iterator;
-import java.util.LinkedList;
import java.util.Set;
+import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.atomic.AtomicReference;
import org.apache.catalina.tribes.io.ObjectReader;
@@ -56,7 +57,7 @@ public class NioReceiver extends Receive
private ServerSocketChannel serverChannel = null;
private DatagramChannel datagramChannel = null;
- protected final LinkedList<Runnable> events = new LinkedList<>();
+ protected final Deque<Runnable> events = new ConcurrentLinkedDeque<>();
public NioReceiver() {
}
@@ -68,8 +69,10 @@ public class NioReceiver extends Receive
}
/**
- * start cluster receiver
- * @throws IOException
+ * Start cluster receiver.
+ *
+ * @throws IOException If the receiver fails to start
+ *
* @see org.apache.catalina.tribes.ChannelReceiver#start()
*/
@Override
@@ -141,25 +144,33 @@ public class NioReceiver extends Receive
public void addEvent(Runnable event) {
Selector selector = this.selector.get();
- if ( selector != null ) {
+ if (selector != null) {
synchronized (events) {
events.add(event);
}
- if ( log.isTraceEnabled() ) log.trace("Adding event to
selector:"+event);
- if ( isListening() ) selector.wakeup();
+ if (log.isTraceEnabled()) {
+ log.trace("Adding event to selector:" + event);
+ }
+ if (isListening()) {
+ selector.wakeup();
+ }
}
}
public void events() {
- if ( events.size() == 0 ) return;
+ if (events.size() == 0) {
+ return;
+ }
synchronized (events) {
Runnable r = null;
- while ( (events.size() > 0) && (r = events.removeFirst()) != null
) {
+ while ((r = events.pollFirst()) != null ) {
try {
- if ( log.isTraceEnabled() ) log.trace("Processing event in
selector:"+r);
+ if (log.isTraceEnabled()) {
+ log.trace("Processing event in selector:" + r);
+ }
r.run();
- } catch ( Exception x ) {
- log.error("",x);
+ } catch (Exception x) {
+ log.error("", x);
}
}
events.clear();
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org