On Linux, various `stat()` calls allow probing information about files
without opening them, but until recently, there wasn't an equivalent API
available on Windows.  Now that `GetFileInformationByName()` exists,
we can use it instead of `GetFileInformationByHandle()`, which required
first opening the file to create a file handle, then reading the file
attributes, and finally closing the file handle.

Since `GetFileInformationByName()` is available on only newer versions
of Windows, this patch uses conditional compilation and `LoadLibrary()`
+ `GetProcAddress()` to dynamically set the pointer to the API function.
If the dynamic loading fails, we fall back to the old API.  To avoid
problems with race conditions, we use Windows' `INIT_ONCE` and
`InitOnceExecuteOnce()` to initialize the function pointer exactly once.

The rest of the patch is similar to the addition of any new JNI function
call.  WindowsConstants.java adds the relevant flags and error codes,
WindowsFileAttributes.java adds the Java entry point,
WindowsNativeDispatcher.java links the Java function with the C
function, and WindowsNativeDispatcher.c calls the Win32 API function.

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

-------------

Commit messages:
 - Prefer `GetFileInformationByName()` over `GetFileInformationByHandle()`

Changes: https://git.openjdk.org/jdk/pull/30994/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=30994&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8383623
  Stats: 462 lines in 7 files changed: 462 ins; 0 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/30994.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/30994/head:pull/30994

PR: https://git.openjdk.org/jdk/pull/30994

Reply via email to