7172826: (se) Selector based on the Solaris event port mechanism

Alan Bateman Alan.Bateman at oracle.com
Sun Jun 3 13:53:35 PDT 2012


I mentioned in a recent mail that I have a new Selector implementation 
for Solaris that uses the event port mechanism rather than the /dev/poll 
driver.  Joy Xiong from the Solaris performance team in Oracle has also 
been running various workloads with this Selector and is reporting good 
results, better in some cases.

The patch proposed here is to add this Selector, but without changing 
the default at this time. The default will continue to be the /dev/poll 
Selector and the java.nio.channels.spi.SelectorProvider system property 
can be used to select the event port Selector where needed. Once the new 
Selector has baked and we have more performance data, then we may 
consider changing the default. Another motivation to changing the 
default is that the /dev/poll is legacy and may go away in the future.

The Selector API was originally modeled on the poll interface and so 
doesn't map too well to I/O polling facilities that aren't level 
triggered. The way this implementation works is that after each poll 
(port_getn to retrieve multiple events) then the polled file descriptors 
are candidates for re-registration for the next poll. Changes to the 
interest ops will override this so that the file descriptor may be 
re-registered for different events, or not re-registered for cases where 
the interest ops are changed to 0 or the selection key is canceled. This 
seems to work better than optimistically re-registering all polled file 
descriptors immediately. One other difference compared to the other 
Selector implementations is the wakeup mechanism (Selector.wakeup) is 
implemented by sending a user event to the port rather than using the 
socket pair mechanism.

A couple of notes on the implementation:

1. For now sun.nio.ch.SolarisEventPort is changed to expose the event 
port API for the Selector implementation. Ideally the event port API 
would be factored out for use by the Selector and Asynchronous I/O 
implementations but that has ripple effects that would require renaming 
some classes. This can be done via a refactoring patch later.

2. The fdLimit method has moved from the Selectors to IOUtil so this 
requires minor adjustments in a few places.

3. The changes to the tests in the webrev are to allow the 
java.nio.channels.spi.SelectorProvider property be passed to tests via 
jtreg's -vmoption. Another idea is to add a script as a test that runs 
several of the existing tests with this Selector. We have alternative 
Selector implementations already, like the poll Selector that is our 
backup on Linux, Solaris and Mac and that could be tested in a similar way.

I think that's mostly it, the webrev with patch is here:

http://cr.openjdk.java.net/~alanb/7172826/webrev/

-Alan.


More information about the nio-dev mailing list