On Thu, 5 May 2022 23:39:30 GMT, Brian Burkhalter <b...@openjdk.org> wrote:

>> Modify native multi-byte read-write code used by the `java.io` classes to 
>> limit the size of the allocated native buffer thereby decreasing off-heap 
>> memory footprint and increasing throughput.
>
> Brian Burkhalter has updated the pull request with a new target base due to a 
> merge or a rebase. The incremental webrev excludes the unrelated changes 
> brought in by the merge/rebase. The pull request contains four additional 
> commits since the last revision:
> 
>  - 6478546: Clean up io_util.c
>  - Merge
>  - 6478546: Decrease malloc'ed buffer maximum size to 64 kB
>  - 6478546: FileInputStream.read() throws OutOfMemoryError when there is 
> plenty available

src/java.base/share/native/libjava/io_util.c line 79:

> 77:           jint off, jint len, jfieldID fid)
> 78: {
> 79:     char stackBuf[STACK_BUF_SIZE];

This was in the original code already, but doesn't this always allocate 8k on 
the stack, regardless of whether this buffer will be used (if len > 8k or len 
== 0)?  Wouldn't it be better to allocate this only in the `else` case?

Would apply to the write code as well.

src/java.base/share/native/libjava/io_util.c line 81:

> 79:     char stackBuf[STACK_BUF_SIZE];
> 80:     char *buf = NULL;
> 81:     jint buf_size, read_size;;

minor: double semi colon

src/java.base/share/native/libjava/io_util.c line 129:

> 127:             off += n;
> 128:         } else if (n == -1) {
> 129:             JNU_ThrowIOExceptionWithLastError(env, "Read error");

The original code would have `nread` set to `-1` here, and thus exit with `-1`. 
 The new code would exit with the last value for `nread` which could be 
anything.

src/java.base/share/native/libjava/io_util.c line 201:

> 199:         write_size = len < buf_size ? len : buf_size;
> 200:         (*env)->GetByteArrayRegion(env, bytes, off, write_size, 
> (jbyte*)buf);
> 201:         if (!(*env)->ExceptionOccurred(env)) {

Wouldn't this result in an infinite loop if `GetByteArrayRegion` triggered an 
exception and `len > 0` ?  It would never enter the `if` and `len` is never 
changed then...

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

PR: https://git.openjdk.java.net/jdk/pull/8235

Reply via email to