Skip to content

Commit 547e275

Browse files
committed
cleanup
1 parent 2563ce7 commit 547e275

File tree

2 files changed

+28
-22
lines changed

2 files changed

+28
-22
lines changed

src/main/cpp/windows/jssc.cpp

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -252,29 +252,40 @@ JNIEXPORT jint JNICALL Java_jssc_SerialNativeInterface_writeBytes
252252
OVERLAPPED *overlapped = new OVERLAPPED();
253253
overlapped->hEvent = CreateEventA(NULL, true, false, NULL);
254254
DWORD err = 0;
255-
if(WriteFile(hComm, jBuffer, (DWORD)env->GetArrayLength(buffer), &lpNumberOfBytesWritten, overlapped)){
256-
returnValue = lpNumberOfBytesWritten;
257-
}else{
255+
do{
256+
err = !WriteFile(hComm, jBuffer, (DWORD)env->GetArrayLength(buffer), &lpNumberOfBytesWritten, overlapped);
257+
if( !err ){ /* successfully written. we're already done. */
258+
returnValue = lpNumberOfBytesWritten;
259+
break;
260+
}
258261
err = GetLastError();
259-
if( err == ERROR_IO_PENDING ){
260-
if(WaitForSingleObject(overlapped->hEvent, INFINITE) == WAIT_OBJECT_0){
261-
if(GetOverlappedResult(hComm, overlapped, &lpNumberOfBytesTransferred, false)){
262-
returnValue = lpNumberOfBytesTransferred;
263-
}
264-
}else{
265-
err = GetLastError();
266-
}
262+
if( err != ERROR_IO_PENDING ){
263+
break; /* some unknown error occurred. Go reporting it. */
267264
}
268-
}
265+
/* our write above was async (IO_PENDING). So it was only fired off, but
266+
* we do not know the result yet. Therefore we've to wait for the result. */
267+
if( WaitForSingleObject(overlapped->hEvent, INFINITE) != WAIT_OBJECT_0 ){
268+
/* too bad :( wait failed. */
269+
err = GetLastError();
270+
break;
271+
}
272+
/* waited successfully. Time to get the result. */
273+
if( GetOverlappedResult(hComm, overlapped, &lpNumberOfBytesTransferred, false) ){
274+
/* we know the result now */
275+
returnValue = lpNumberOfBytesTransferred;
276+
err = 0;
277+
}else{ /* GetOverlappedResult has failed :( */
278+
err = GetLastError();
279+
}
280+
}while(0);
269281
env->ReleaseByteArrayElements(buffer, jBuffer, 0);
270282
CloseHandle(overlapped->hEvent);
271283
delete overlapped;
272-
if( returnValue < 0 ){
284+
if( err ){
273285
char emsg[128];
274-
snprintf(emsg, sizeof emsg, "Error %d. Details: https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes#system-error-codes", err);
286+
snprintf(emsg, sizeof emsg, "Error %d: https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes#system-error-codes", err);
275287
jobject *exClz = env->FindClass("jssc/SerialPortException");
276288
if( exClz ) env->ThrowNew(exClz, emsg);
277-
return 0;
278289
}
279290
return returnValue;
280291
}

src/main/java/jssc/SerialPort.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -411,15 +411,10 @@ public boolean setDTR(boolean enabled) throws SerialPortException {
411411
*/
412412
@Deprecated
413413
public boolean writeBytes1(byte[] buffer) throws SerialPortException {
414-
checkPortOpened("writeBytes()");
415414
/* Delegate to new method and translate result to what original method
416415
* did return. */
417-
try{
418-
int numWrittenBytes = writeBytes(buffer);
419-
return numWrittenBytes == buffer.length;
420-
} catch(IOException ex) {
421-
throw SerialPortException.wrapNativeException(ex, this, "writeBytes1");
422-
}
416+
int numWrittenBytes = writeBytes(buffer);
417+
return numWrittenBytes == buffer.length;
423418
}
424419

425420
/**

0 commit comments

Comments
 (0)