8223353: (ch) Change channel close implementation to not wait for I/O threads

Daniel Fuchs daniel.fuchs at oracle.com
Tue May 7 11:56:41 UTC 2019


Hi Alan,

The changes seem reasonable to me. It looks like a nice
simplification. I guess the JIRA issue will need a noreg-cleanup
label. I assume you have verified that the tests have remained
stable?

best regards,

-- daniel

On 05/05/2019 20:00, Alan Bateman wrote:
> I'd like to refactor the SelectableChannel close implementations so that 
> the close methods don't wait for I/O operations to abort when closing a 
> channel in blocking mode.
> 
> As I'm sure we all know here, closing a channel is complicated because 
> it requires coordinating with threads doing I/O operations. It also 
> requires coordinating with selection operations as the channel may be 
> registered with one or more Selectors. As things currently stand, 
> closing a channel in blocking mode with threads blocked in I/O 
> operations involves:
> 
> 1. pre-close (the dup2 trick to close the connection but not release the 
> file descriptor)
> 2. signal the threads in blocking I/O operations so that they abort with 
> EINTR
> 3. wait for the threads to complete/abort the I/O operation
> 4. close the file descriptor (if not registered with a Selector - not 
> usually possible with channels configured in blocking mode but there are 
> convoluted scenarios to consider).
> 
> For comparison, the non-blocking case is a simple lock/unlock to ensure 
> that all I/O operations have completed and then closing the file 
> descriptor when not registered with a Selector. If registered with a 
> Selector then the close is deferred until its key is flushed from the 
> last Selector that it is registered with.
> 
> The proposed change is to eliminate #3 above and have the last I/O 
> operation to complete do the final close. This simplifies the close nd 
> means that I/O operation in progress and registered with Selector cases 
> are handled consistently. The change should not be observable to code 
> using these APIs as the pre-close will close the connection as before.
> 
> One benefit of the change is that is Thread.interrupt doesn't wait. A 
> second benefit is that we move stateLock in the implementations back to 
> being a built-in monitor, the condition object used to await/signal, 
> goes away.
> 
> The webrev with the proposed changes is here. The changes to stateLock 
> are purely mechanical, everything else is the refactor of the 
> implCloseSelectableChannel implementations.
> 
> http://cr.openjdk.java.net/~alanb/8223353/0/webrev/
> 
> -Alan



More information about the nio-dev mailing list