@@ -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}
0 commit comments