changeset 964:768414c16e10

remove SelectSet
author Franklin Schmidt <fschmidt@gmail.com>
date Fri, 14 Oct 2016 01:03:47 -0600
parents 4b6216fa9cec
children 866f2e801618
files src/org/eclipse/jetty/io/nio/SelectChannelEndPoint.java src/org/eclipse/jetty/io/nio/SelectorManager.java src/org/eclipse/jetty/server/nio/SelectChannelConnector.java
diffstat 3 files changed, 120 insertions(+), 189 deletions(-) [+]
line wrap: on
line diff
--- a/src/org/eclipse/jetty/io/nio/SelectChannelEndPoint.java	Fri Oct 14 00:15:28 2016 -0600
+++ b/src/org/eclipse/jetty/io/nio/SelectChannelEndPoint.java	Fri Oct 14 01:03:47 2016 -0600
@@ -32,7 +32,6 @@
 import org.eclipse.jetty.io.ConnectedEndPoint;
 import org.eclipse.jetty.io.Connection;
 import org.eclipse.jetty.io.EofException;
-import org.eclipse.jetty.io.nio.SelectorManager.SelectSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,7 +44,6 @@
 {
 	public static final Logger LOG=LoggerFactory.getLogger("org.eclipse.jetty.io.nio");
 
-	private final SelectorManager.SelectSet _selectSet;
 	private final SelectorManager _manager;
 	private final SelectionKey _key;
 	private final Runnable _handler = new Runnable()
@@ -79,13 +77,12 @@
 
 	private boolean _ishut = false;
 
-	public SelectChannelEndPoint(SocketChannel channel, SelectSet selectSet, SelectionKey key, int maxIdleTime)
+	public SelectChannelEndPoint(SocketChannel channel, SelectorManager manager, SelectionKey key, int maxIdleTime)
 		throws IOException
 	{
 		super(channel, maxIdleTime);
 
-		_manager = selectSet.getManager();
-		_selectSet = selectSet;
+		_manager = manager;
 		_key = key;
 	}
 
@@ -234,7 +231,7 @@
 		if (isInputShutdown())
 			throw new EofException();
 
-		long now = _selectSet.getNow();
+		long now = _manager.getNow();
 		long end = now+timeoutMs;
 		try
 		{
@@ -252,7 +249,7 @@
 				}
 				finally
 				{
-					now = _selectSet.getNow();
+					now = _manager.getNow();
 				}
 
 				if (_readBlocked && timeoutMs>0 && now>=end)
@@ -276,7 +273,7 @@
 		if (isOutputShutdown())
 			throw new EofException();
 
-		long now=_selectSet.getNow();
+		long now=_manager.getNow();
 		long end=now+timeoutMs;
 		try
 		{
@@ -294,7 +291,7 @@
 				}
 				finally
 				{
-					now = _selectSet.getNow();
+					now = _manager.getNow();
 				}
 				if (_writeBlocked && timeoutMs>0 && now>=end)
 					return false;
@@ -333,7 +330,7 @@
 			|   ((!_socket.isOutputShutdown()&& write_interest) ? SelectionKey.OP_WRITE : 0);
 			if( _key.interestOps() != interestOps ) {
 				_key.interestOps(interestOps);
-				_selectSet.getSelector().update();
+				_manager.getSelector().update();
 			}
 		} else {
 			_key.cancel();
--- a/src/org/eclipse/jetty/io/nio/SelectorManager.java	Fri Oct 14 00:15:28 2016 -0600
+++ b/src/org/eclipse/jetty/io/nio/SelectorManager.java	Fri Oct 14 01:03:47 2016 -0600
@@ -56,18 +56,18 @@
  */
 public abstract class SelectorManager extends AbstractLifeCycle implements Dumpable
 {
-	public static final Logger LOG=LoggerFactory.getLogger("org.eclipse.jetty.io.nio");
+	public static final Logger LOG = LoggerFactory.getLogger("org.eclipse.jetty.io.nio");
 
-	private int _maxIdleTime;
-	private long _lowResourcesConnections;
-	private SelectSet _selectSet;
+	private final int _maxIdleTime;
+	private volatile long _now = System.currentTimeMillis();
+	private SaneSelector _selector;
 
 	/* ------------------------------------------------------------ */
 	/**
 	 * @param maxIdleTime The maximum period in milli seconds that a connection may be idle before it is closed.
 	 * @see #setLowResourcesMaxIdleTime(long)
 	 */
-	public void setMaxIdleTime(int maxIdleTime)
+	public SelectorManager(int maxIdleTime)
 	{
 		_maxIdleTime = maxIdleTime;
 	}
@@ -76,47 +76,41 @@
 	/** Register a channel
 	 * @param channel
 	 */
-	public void register(SocketChannel channel)
+	public final void register(SocketChannel channel)
 	{
+/*
 		SelectSet set = _selectSet;
 		if (set!=null)
 		{
 			set.addChange(channel);
 		}
-	}
-
-	/* ------------------------------------------------------------ */
-	/**
-	 * @return the lowResourcesConnections
-	 */
-	public long getLowResourcesConnections()
-	{
-		return _lowResourcesConnections;
-	}
-
-	/* ------------------------------------------------------------ */
-	/**
-	 * Set the number of connections, which if exceeded places this manager in low resources state.
-	 * This is not an exact measure as the connection count is averaged over the select sets.
-	 * @param lowResourcesConnections the number of connections
-	 * @see #setLowResourcesMaxIdleTime(long)
-	 */
-	public void setLowResourcesConnections(long lowResourcesConnections)
-	{
-		_lowResourcesConnections = lowResourcesConnections;
+*/
+		try {
+			SelectionKey key = _selector.register(channel,0,null);
+			SelectChannelEndPoint endpoint = new SelectChannelEndPoint(channel,this,key, _maxIdleTime);
+			endpoint.setConnection(newConnection(channel,endpoint));
+			key.attach(endpoint);
+			_selector.update();
+//System.out.println("qqqqqqqqqqqqqqqqqqqqqqqqqqqqq b");
+			endpoint.schedule();
+		} catch(IOException e) {
+			LOG.warn("",e);
+			try {
+				channel.close();
+			} catch(IOException e2) {
+				LOG.warn("",e2);
+			}
+		}
 	}
 
 
 	public abstract void execute(Runnable task);
 
-	/* ------------------------------------------------------------ */
-	/* (non-Javadoc)
-	 * @see org.eclipse.component.AbstractLifeCycle#doStart()
-	 */
+
 	@Override
 	protected void doStart() throws Exception
 	{
-		_selectSet = new SelectSet();
+		_selector = new SaneSelector();
 
 		super.doStart();
 
@@ -128,8 +122,7 @@
 				String name=Thread.currentThread().getName();
 				try
 				{
-					SelectSet set = _selectSet;
-					if (set==null)
+					if (_selector==null)
 						return;
 
 					Thread.currentThread().setName(name+" Selector");
@@ -138,7 +131,7 @@
 					{
 						try
 						{
-							set.doSelect();
+							doSelect();
 						}
 						catch(IOException e)
 						{
@@ -152,6 +145,7 @@
 				}
 				finally
 				{
+					_selector = null;
 					LOG.debug("Stopped {} on {}",Thread.currentThread(),this);
 					Thread.currentThread().setName(name);
 				}
@@ -162,13 +156,32 @@
 
 
 	@Override
-	protected void doStop() throws Exception
+	protected synchronized void doStop() throws Exception
 	{
-		SelectSet set = _selectSet;
-		_selectSet = null;
-		if (set!=null)
+		if (_selector!=null)
 		{
-			set.stop();
+			// close endpoints and selector
+			for (SelectionKey key : _selector.keys())
+			{
+				EndPoint endpoint = (EndPoint)key.attachment();
+				try
+				{
+					endpoint.close();
+				}
+				catch(IOException e)
+				{
+					LOG.trace("",e);
+				}
+			}
+	
+			try
+			{
+				_selector.close();
+			}
+			catch (IOException e)
+			{
+				LOG.trace("",e);
+			}
 		}
 		super.doStop();
 	}
@@ -185,160 +198,81 @@
 	public void dump(Appendable out, String indent) throws IOException
 	{
 		AggregateLifeCycle.dumpObject(out,this);
-		AggregateLifeCycle.dump(out,indent,Collections.singletonList(_selectSet));
+//		AggregateLifeCycle.dump(out,indent,Collections.emptyList());
 	}
 
 
-	public final class SelectSet implements Dumpable
-	{
-		private volatile long _now = System.currentTimeMillis();
+	// from SelectSet
 
-		private final SaneSelector _selector;
-
-		private SelectSet() throws IOException
+	private void doSelect() throws IOException
+	{
+		try
 		{
-			_selector = new SaneSelector();
-		}
-
-		private void addChange(SocketChannel channel)
-		{
-			try {
-//System.out.println("qqqqqqqqqqqqqqqqqqqqqqqqqqqqq a");
-//				SelectionKey key = _selector.register(channel,SelectionKey.OP_READ,null);
-				SelectionKey key = _selector.register(channel,0,null);
-
-				SelectChannelEndPoint endpoint = new SelectChannelEndPoint(channel,this,key, _maxIdleTime);
-				endpoint.setConnection(newConnection(channel,endpoint));
+			_selector.select();
 
-				key.attach(endpoint);
-//				key.interestOps(SelectionKey.OP_READ);
-				_selector.update();
-//System.out.println("qqqqqqqqqqqqqqqqqqqqqqqqqqqqq b");
-				endpoint.schedule();
-			} catch(IOException e) {
-				LOG.warn("",e);
-				try {
-					channel.close();
-				} catch(IOException e2) {
-					LOG.warn("",e2);
-				}
-			}
-		}
-
-		private void doSelect() throws IOException
-		{
-			try
+			// Look for things to do
+			for (SelectionKey key: _selector.selectedKeys())
 			{
-				_selector.select();
+				try
+				{
+					if (!key.isValid())
+					{
+						key.cancel();
+						continue;
+					}
 
-				// Look for things to do
-				for (SelectionKey key: _selector.selectedKeys())
-				{
-					try
-					{
-						if (!key.isValid())
-						{
-							key.cancel();
-							continue;
-						}
-
-						if (key.isReadable()||key.isWritable()) {
-							SelectChannelEndPoint endpoint = (SelectChannelEndPoint)key.attachment();
-							endpoint.schedule();
-						}
-					}
-					catch (CancelledKeyException e)
-					{
-//						LOG.trace("",e);
-						LOG.warn("",e);
-					}
-					catch (Exception e)
-					{
-						LOG.warn("",e);
+					if (key.isReadable()||key.isWritable()) {
+						SelectChannelEndPoint endpoint = (SelectChannelEndPoint)key.attachment();
+						endpoint.schedule();
 					}
 				}
-
-				// Everything always handled
-				_selector.selectedKeys().clear();
-
-				_now = System.currentTimeMillis();
-			}
-			catch (ClosedSelectorException e)
-			{
-				if (isRunning())
+				catch (CancelledKeyException e)
+				{
+					// LOG.trace("",e);
 					LOG.warn("",e);
-				else
-					LOG.trace("",e);
-			}
-			catch (CancelledKeyException e)
-			{
-				LOG.trace("",e);
-			}
-		}
-
-		public SelectorManager getManager()
-		{
-			return SelectorManager.this;
-		}
-
-		public long getNow()
-		{
-			return _now;
-		}
-
-		SaneSelector getSelector()
-		{
-			return _selector;
-		}
-
-		private synchronized void stop() throws Exception
-		{
-			// close endpoints and selector
-			for (SelectionKey key : _selector.keys())
-			{
-				EndPoint endpoint = (EndPoint)key.attachment();
-				try
+				}
+				catch (Exception e)
 				{
-					endpoint.close();
-				}
-				catch(IOException e)
-				{
-					LOG.trace("",e);
+					LOG.warn("",e);
 				}
 			}
 
-			try
-			{
-				_selector.close();
-			}
-			catch (IOException e)
-			{
-				LOG.trace("",e);
-			}
-		}
-
-		@Override
-		public String dump()
-		{
-			return AggregateLifeCycle.dump(this);
-		}
+			// Everything always handled
+			_selector.selectedKeys().clear();
 
-		@Override
-		public void dump(Appendable out, String indent) throws IOException
-		{
-			out.append(String.valueOf(this)).append("\n");
-			AggregateLifeCycle.dump(out,indent,Collections.emptyList());
+			_now = System.currentTimeMillis();
 		}
-
-		@Override
-		public String toString()
+		catch (ClosedSelectorException e)
 		{
-			SaneSelector selector=_selector;
-			return String.format("%s keys=%d selected=%d",
-					super.toString(),
-					selector != null && selector.isOpen() ? selector.keys().size() : -1,
-					selector != null && selector.isOpen() ? selector.selectedKeys().size() : -1);
+			if (isRunning())
+				LOG.warn("",e);
+			else
+				LOG.trace("",e);
+		}
+		catch (CancelledKeyException e)
+		{
+			LOG.trace("",e);
 		}
 	}
 
+	public final long getNow()
+	{
+		return _now;
+	}
+
+	final SaneSelector getSelector()
+	{
+		return _selector;
+	}
+
+	@Override
+	public final String toString()
+	{
+		SaneSelector selector=_selector;
+		return String.format("%s keys=%d selected=%d",
+				super.toString(),
+				selector != null && selector.isOpen() ? selector.keys().size() : -1,
+				selector != null && selector.isOpen() ? selector.selectedKeys().size() : -1);
+	}
+
 }
--- a/src/org/eclipse/jetty/server/nio/SelectChannelConnector.java	Fri Oct 14 00:15:28 2016 -0600
+++ b/src/org/eclipse/jetty/server/nio/SelectChannelConnector.java	Fri Oct 14 01:03:47 2016 -0600
@@ -59,7 +59,6 @@
 	public SelectChannelConnector(Server server,int port)
 	{
 		super(server,port);
-		_manager.setMaxIdleTime(getMaxIdleTime());
 		addBean(_manager,true);
 	}
 	
@@ -91,9 +90,6 @@
 	@Override
 	protected synchronized void doStart() throws Exception
 	{
-//		_manager.setMaxIdleTime(getMaxIdleTime());
-		_manager.setLowResourcesConnections(0);
-
 		if (_acceptChannel == null)
 		{
 			// Create a new server socket
@@ -120,6 +116,10 @@
 
 	private final class ConnectorSelectorManager extends SelectorManager
 	{
+		ConnectorSelectorManager() {
+			super(_maxIdleTime);
+		}
+
 		@Override
 		public void execute(Runnable task)
 		{