Author: fhanik Date: Tue Nov 25 19:54:38 2008 New Revision: 720728 URL: http://svn.apache.org/viewvc?rev=720728&view=rev Log: Add the ability to configure multiple pollers and default them to number of CPUs
Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=720728&r1=720727&r2=720728&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original) +++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Tue Nov 25 19:54:38 2008 @@ -490,7 +490,7 @@ /** * Poller thread count. */ - protected int pollerThreadCount = 1; + protected int pollerThreadCount = Runtime.getRuntime().availableProcessors(); public void setPollerThreadCount(int pollerThreadCount) { this.pollerThreadCount = pollerThreadCount; } public int getPollerThreadCount() { return pollerThreadCount; } @@ -500,9 +500,15 @@ /** * The socket poller. */ - protected Poller poller = null; + protected Poller[] pollers = null; + protected AtomicInteger pollerRotater = new AtomicInteger(0); + /** + * Return an available poller in true round robin fashion + * @return + */ public Poller getPoller0() { - return poller; + int idx = Math.abs(pollerRotater.incrementAndGet()) % pollers.length; + return pollers[idx]; } /** @@ -695,10 +701,14 @@ * Number of keepalive sockets. */ public int getKeepAliveCount() { - if (poller == null) { + if (pollers == null) { return 0; } else { - return poller.selector.keys().size(); + int sum = 0; + for (int i=0; i<pollers.length; i++) { + sum += pollers[i].selector.keys().size(); + } + return sum; } } @@ -845,12 +855,15 @@ workers = new WorkerStack(maxThreads); } - // Start poller thread - poller = new Poller(); - Thread pollerThread = new Thread(poller, getName() + "-ClientPoller"); - pollerThread.setPriority(threadPriority); - pollerThread.setDaemon(true); - pollerThread.start(); + // Start poller threads + pollers = new Poller[getPollerThreadCount()]; + for (int i=0; i<pollers.length; i++) { + pollers[i] = new Poller(); + Thread pollerThread = new Thread(pollers[i], getName() + "-ClientPoller-"+i); + pollerThread.setPriority(threadPriority); + pollerThread.setDaemon(true); + pollerThread.start(); + } // Start acceptor threads for (int i = 0; i < acceptorThreadCount; i++) { @@ -892,8 +905,11 @@ if (running) { running = false; unlockAccept(); - poller.destroy(); - poller = null; + for (int i=0; pollers!=null && i<pollers.length; i++) { + if (pollers[i]==null) continue; + pollers[i].destroy(); + pollers[i] = null; + } } eventCache.clear(); keyCache.clear(); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]