Author: markt
Date: Wed Mar 11 21:35:39 2015
New Revision: 1666017

URL: http://svn.apache.org/r1666017
Log:
Implement the merging.
I opted for certain clarity over the possible speed improvement of a more 
'hands-on' implementation.
Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1666017&r1=1666016&r2=1666017&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Wed Mar 11 
21:35:39 2015
@@ -1928,10 +1928,22 @@ public class AprEndpoint extends Abstrac
 
         private int mergeDescriptors(long[] desc, int startCount) {
             if (OS.IS_BSD || OS.IS_MACOSX) {
-                // TODO Need to actually implement merging of the descriptors 
here.
-                //      I'm currently thinking quicksort followed by running
-                //      through the sorted list to merge the events.
-                return startCount;
+                /*
+                 * Notes: Only the first startCount * 2 elements of the array
+                 *        are populated.
+                 *        The array is event, socket, event, socket etc.
+                 */
+                HashMap<Long,Long> merged = new HashMap<>(startCount);
+                for (int n = 0; n < startCount; n++) {
+                    merged.merge(Long.valueOf(desc[2*n+1]), 
Long.valueOf(desc[2*n]),
+                            (v1, v2) -> Long.valueOf(v1.longValue() | 
v2.longValue()));
+                }
+                int i = 0;
+                for (Map.Entry<Long,Long> entry : merged.entrySet()) {
+                    desc[i++] = entry.getValue().longValue();
+                    desc[i++] = entry.getKey().longValue();
+                }
+                return merged.size();
             } else {
                 // Other OS's do not (as far as it is known) return multiple
                 // entries for the same socket when the socket is registered 
for



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to