Skip to content

Commit

Permalink
Switch to "ByteArrayElements" JNI calls instead of "PrimitiveArrayCri…
Browse files Browse the repository at this point in the history
…tical" since read/write can block
  • Loading branch information
hedgecrw committed Jul 8, 2023
1 parent 1cccfcd commit ed468f6
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 16 deletions.
14 changes: 7 additions & 7 deletions src/main/c/Posix/SerialPort_Posix.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* SerialPort_Posix.c
*
* Created on: Feb 25, 2012
* Last Updated on: Jul 06, 2023
* Last Updated on: Jul 08, 2023
* Author: Will Hedgecock
*
* Copyright (C) 2012-2023 Fazecast, Inc.
Expand Down Expand Up @@ -894,15 +894,15 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_bytesAwaitingWri
JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv *env, jobject obj, jlong serialPortPointer, jbyteArray buffer, jint bytesToRead, jint offset, jint timeoutMode, jint readTimeout)
{
// Ensure that a positive number of bytes was passed in to read
jsize bufferLength = (*env)->GetArrayLength(env, buffer);
serialPort *port = (serialPort*)(intptr_t)serialPortPointer;
if ((bytesToRead < 0) || (offset < 0))
if ((bytesToRead < 0) || (offset < 0) || (bufferLength < offset))
return -1;

// Fetch a pointer to the underlying data buffer
jsize bufferLength = (*env)->GetArrayLength(env, buffer);
int numBytesRead = -1, numBytesReadTotal = offset, ioctlResult = 0;
int bytesRemaining = ((bytesToRead + offset) > bufferLength) ? (bufferLength - offset) : bytesToRead;
jbyte *readBuffer = (*env)->GetPrimitiveArrayCritical(env, buffer, NULL);
jbyte *readBuffer = (*env)->GetByteArrayElements(env, buffer, NULL);
if (checkJniError(env, __LINE__ - 1) || !readBuffer)
return -1;

Expand Down Expand Up @@ -972,7 +972,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv
}

// Return number of bytes read if successful
(*env)->ReleasePrimitiveArrayCritical(env, buffer, readBuffer, (numBytesRead == -1) ? JNI_ABORT : 0);
(*env)->ReleaseByteArrayElements(env, buffer, readBuffer, (numBytesRead == -1) ? JNI_ABORT : 0);
checkJniError(env, __LINE__ - 1);
return (numBytesRead == -1) ? -1 : (numBytesReadTotal - offset);
}
Expand All @@ -989,7 +989,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn
if ((bytesToWrite + offset) > bufferLength)
bytesToWrite = bufferLength - offset;
int writeBlockingMode = (timeoutMode & com_fazecast_jSerialComm_SerialPort_TIMEOUT_WRITE_BLOCKING);
jbyte *writeBuffer = (*env)->GetPrimitiveArrayCritical(env, buffer, NULL);
jbyte *writeBuffer = (*env)->GetByteArrayElements(env, buffer, NULL);
if (checkJniError(env, __LINE__ - 1) || !writeBuffer)
return -1;

Expand All @@ -1007,7 +1007,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn
tcdrain(port->handle);

// Return the number of bytes written if successful
(*env)->ReleasePrimitiveArrayCritical(env, buffer, writeBuffer, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, buffer, writeBuffer, JNI_ABORT);
checkJniError(env, __LINE__ - 1);
return numBytesWritten;
}
Expand Down
18 changes: 9 additions & 9 deletions src/main/c/Windows/SerialPort_Windows.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* SerialPort_Windows.c
*
* Created on: Feb 25, 2012
* Last Updated on: Jun 27, 2023
* Last Updated on: Jul 08, 2023
* Author: Will Hedgecock
*
* Copyright (C) 2012-2023 Fazecast, Inc.
Expand Down Expand Up @@ -1073,15 +1073,15 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_bytesAwaitingWri
JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv *env, jobject obj, jlong serialPortPointer, jbyteArray buffer, jint bytesToRead, jint offset, jint timeoutMode, jint readTimeout)
{
// Ensure that a positive number of bytes was passed in to read
jsize bufferLength = (*env)->GetArrayLength(env, buffer);
serialPort *port = (serialPort*)(intptr_t)serialPortPointer;
if ((bytesToRead < 0) || (offset < 0))
if ((bytesToRead < 0) || (offset < 0) || (bufferLength < offset))
return -1;

// Fetch a pointer to the underlying data buffer
jsize bufferLength = (*env)->GetArrayLength(env, buffer);
if ((bytesToRead + offset) > bufferLength)
bytesToRead = bufferLength - offset;
jbyte *readBuffer = (*env)->GetPrimitiveArrayCritical(env, buffer, NULL);
jbyte *readBuffer = (*env)->GetByteArrayElements(env, buffer, NULL);
if (checkJniError(env, __LINE__ - 1) || !readBuffer)
return -1;

Expand All @@ -1094,7 +1094,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv
port->errorNumber = GetLastError();
port->errorLineNumber = __LINE__ - 4;
CloseHandle(overlappedStruct.hEvent);
(*env)->ReleasePrimitiveArrayCritical(env, buffer, readBuffer, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, buffer, readBuffer, JNI_ABORT);
return -1;
}

Expand All @@ -1114,7 +1114,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_readBytes(JNIEnv

// Return number of bytes read
CloseHandle(overlappedStruct.hEvent);
(*env)->ReleasePrimitiveArrayCritical(env, buffer, readBuffer, (result == TRUE) ? 0 : JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, buffer, readBuffer, (result == TRUE) ? 0 : JNI_ABORT);
checkJniError(env, __LINE__ - 1);
return (result == TRUE) ? numBytesRead : -1;
}
Expand All @@ -1130,7 +1130,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn
jsize bufferLength = (*env)->GetArrayLength(env, buffer);
if ((bytesToWrite + offset) > bufferLength)
bytesToWrite = bufferLength - offset;
jbyte *writeBuffer = (*env)->GetPrimitiveArrayCritical(env, buffer, NULL);
jbyte *writeBuffer = (*env)->GetByteArrayElements(env, buffer, NULL);
if (checkJniError(env, __LINE__ - 1) || !writeBuffer)
return -1;

Expand All @@ -1143,7 +1143,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn
port->errorNumber = GetLastError();
port->errorLineNumber = __LINE__ - 4;
CloseHandle(overlappedStruct.hEvent);
(*env)->ReleasePrimitiveArrayCritical(env, buffer, writeBuffer, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, buffer, writeBuffer, JNI_ABORT);
return -1;
}

Expand All @@ -1163,7 +1163,7 @@ JNIEXPORT jint JNICALL Java_com_fazecast_jSerialComm_SerialPort_writeBytes(JNIEn

// Return number of bytes written
CloseHandle(overlappedStruct.hEvent);
(*env)->ReleasePrimitiveArrayCritical(env, buffer, writeBuffer, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, buffer, writeBuffer, JNI_ABORT);
checkJniError(env, __LINE__ - 1);
return (result == TRUE) ? numBytesWritten : -1;
}
Expand Down

0 comments on commit ed468f6

Please sign in to comment.