Chris,
Looks good for me.
-Dmitry

On 2013-01-31 01:36, Chris Hegarty wrote:
> There is a very small, and very old, window for a race in the socket
> asynchronous close mechanism on Linux. This can lead to blocking socket
> operations never returning even after the socket has been closed.
> 
> This issue would appear to exist since its (linux_close.c) creation back
> in 1.4, but since the window for the race is tiny, it seems to have gone
> unnoticed until now. It was originally diagnosed through code
> inspection, but since then I have created and added a small test that
> reproduce the issue about one in every 10 - 20 runs, with jdk8, on
> Ubuntu 12.04, with 2x 2.33GHz Intel Xeon E5345 (2x quad-core, 1 thread
> per core => 8 threads).
> 
> closefd first interrupts (sends wakeup signal to) all the threads
> blocked on the fd, then it closes/dup2's the fd. However, the signal may
> arrive at its target thread before that thread has entered the blocking
> system call, and before close/dup2. In this case, the target thread will
> simple enter the blocking system call and never return.
> 
> Solution
> ---------
> If it was to close/dup2 the fd before issuing the wake up, then any
> thread not yet blocked in a system call should see that the fd is closed
> on entry, otherwise it will be woken up by the signal.
> 
> While there is an equivalent closefd in bsd_close.c ( mac/bsd specific
> code), I have not been able to reproduce this issue after many test runs
> on mac. Also, making similar changes to closefd in bsd_close runs into a
> problem with dup2; dup2 will hang if another thread is doing a blocking
> operation. I believe this issue is similar to 7133499. So as far as this
> issue is concerned changes will only be make to the Linux version of
> closefd.
> 
> Webrev
> -------
> 
> http://cr.openjdk.java.net/~chegar/8006395/webrev.00/webrev/
> 
> -Chris.


-- 
Dmitry Samersoff
Oracle Java development team, Saint Petersburg, Russia
* Give Rabbit time, and he'll always get the answer

Reply via email to