8029516: (fs) WatchKey cancel unreliable on Windows

Chris Hegarty chris.hegarty at oracle.com
Fri Sep 5 09:30:23 UTC 2014


This change look ok to me.

-Chris.

On 04/09/14 17:58, Alan Bateman wrote:
>
> This is a bug is the Windows implementation of WatchService.
>
> The Windows implementation is based on ReadDirectoryChangesW. It is used
> asynchronously with a background thread, called the Poller, to service
> the events as they are queued to an I/O completion port. It's one thread
> per WatchService and there can be many directories registered with the
> same WatchService.
>
> The cancel method is tricky. It's done by the Poller thread on behalf of
> the caller of cancel and works by closing the handle to the directory.
> Unfortunately this isn't quite right as it causes the outstanding
> ReadDirectoryChangesW operation to abort and attempt to set an event in
> the OVERLAPPED structure that might be freed at around that point
>
> To fix this requires the Poller to cancel the outstanding
> ReadDirectoryChangesW and wait for it to complete before close the
> directory and releasing the resources. It unfortunately requires an
> additional (unnamed) event per watched directory but overall the changes
> aren't too bad. I've used the opportunity to clean up a few small things
> in passing.
>
> The awkward part is creating a test that is anyway useful, it is very
> machine and load dependent. The test that I have included will duplicate
> it periodically when running on a loaded system, say when running tests
> concurrently. All the existing tests pass on Windows 32-bit and 64-bit.
>
> The webrev with the changes is here:
>     http://cr.openjdk.java.net/~alanb/8029516/webrev/
>
> -Alan


More information about the nio-dev mailing list