RFR: 8299518: HotSpotVirtualMachine shared code across different platforms [v3]

David Holmes dholmes at openjdk.org
Thu Jan 5 05:46:50 UTC 2023


On Thu, 5 Jan 2023 04:59:51 GMT, Serguei Spitsyn <sspitsyn at openjdk.org> wrote:

>> src/jdk.attach/windows/classes/sun/tools/attach/VirtualMachineImpl.java line 130:
>> 
>>> 128:         @Override
>>> 129:         protected int read(long fd, byte[] bs, int off, int len) throws IOException {
>>> 130:             return VirtualMachineImpl.readPipe(fd, bs, off, len);
>> 
>> If you add read/close methods for Windows that then call readPipe/closePipe, then we don't need to subclass and override.
>
> Good suggestion.
> However, I wonder why the `fd` is casted from `long` to `int` on Unix. The Unix versions of SocketInputStream had `int fd`.
> So, the following code also needs to cast `fd` to `int`:
> 
> +        public synchronized int read(byte[] bs, int off, int len) throws IOException {
> +            if ((off < 0) || (off > bs.length) || (len < 0) ||
> +                ((off + len) > bs.length) || ((off + len) < 0)) {
> +                throw new IndexOutOfBoundsException();
> +            } else if (len == 0) {
> +                return 0;
> +            }
> +            return read(fd, bs, off, len);       <== ???
> +        }
> +
> +        public synchronized void close() throws IOException {
> +            if (fd != -1) {
> +                close(fd);                  <== ???
> +            }

Looks like Windows needs a long fd so the shared API takes long and we then cast to int for the Unix native methods. A little messy but fixable.

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

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


More information about the serviceability-dev mailing list