8198562: (ch) Separate blocking and non-blocking code paths (part 1)
Claes Redestad
claes.redestad at oracle.com
Fri Feb 23 13:45:27 UTC 2018
Hi,
while there are certainly things in the neighborhood that is in want of
a cleanup, these changes looks good to me.
/Claes
On 2018-02-22 20:08, Alan Bateman wrote:
>
> I mentioned in a thread here earlier this month that I have a number
> of patches to reduce the complexity and overhead of supporting async
> close and interrupt in the selectable channel implementations. All
> combined, there are a lot of changes but are easy to split into a
> series of smaller patches that are easier to test and review.
>
> The patch here changes the SocketChannel and ServerSocketChannel
> implementations so that channels configured non-blocking don't set the
> hook for Thread.interrupt or don't track the threads potentially
> blocking in I/O operations. The blocking case is improved too by
> reducing, at least for the SocketChannel implementation, the locking
> around the blocking calls. All the locking is consistent now,
> something that will be clearer once the changes to DatagramChannel and
> the Pipe.* implementations are discussed.
>
> Simplification of the read/write/accept/connect/finishConnect methods
> means that the implCloseSelectableChannel has to handle both the
> blocking and non-blocking cases but it's not too complicated.
>
> The socket adaptors have also changed so that they do timed operations
> (Socket setSoTimeout and friends) with the channel configured
> blocking. This it to avoid an explosion of scenarios (and complexity)
> that arises when trying to be both blocking and non-blocking at the
> same time.
>
> In terms of compatibility, there are two behavioral changes:
>
> 1. If a thread's interrupt status is set and it invokes an I/O method
> on a channel configured non-blocking then the channel will not be
> closed. The original specification was vague on this point as it
> focused on threads blocking in I/O operations. Several people have
> complained bitterly over the years about the existing behavior so they
> will welcome this change. I haven't found anything yet that depends on
> long standing behavior but we will need to track this in a CSR anyway.
>
> 2. configureBlocking will now block if there are pending I/O
> operations. The spec has always stated that it may block so it should
> not be a surprise but there may be some cases where code attempts to
> change a channel to non-blocking while another thread is doing on a
> blocking I/O operation on the channel. This method now coordinates
> with channel closing, something that has never been right in the
> implementation.
>
> The webrev with the patch is here:
> http://cr.openjdk.java.net/~alanb/8198562/webrev/
>
> -Alan
More information about the nio-dev
mailing list