4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-07 15:00:24 +08:00

* fhandler_serial.cc (raw_write): Use local copy of OVERLAPPED structure

instead of shared structure to fix a race condition between read/write.
This commit is contained in:
Christopher Faylor 2001-01-30 01:52:29 +00:00
parent 3aaa66f813
commit 747e88d3f6
2 changed files with 15 additions and 7 deletions

View File

@ -1,3 +1,9 @@
Mon Jan 29 17:15:22 2001 Bill Hegardt <bill@troyxcd.com>
* fhandler_serial.cc (raw_write): Use local copy of OVERLAPPED
structure instead of shared structure to fix a race condition between
read/write.
Mon Jan 29 14:30:00 2001 Corinna Vinschen <corinna@vinschen.de> Mon Jan 29 14:30:00 2001 Corinna Vinschen <corinna@vinschen.de>
* mmap.cc (mmap): Remove obsolete check for MAP_SHARED|MAP_ANON as * mmap.cc (mmap): Remove obsolete check for MAP_SHARED|MAP_ANON as

View File

@ -161,15 +161,15 @@ int
fhandler_serial::raw_write (const void *ptr, size_t len) fhandler_serial::raw_write (const void *ptr, size_t len)
{ {
DWORD bytes_written; DWORD bytes_written;
OVERLAPPED write_status;
if (overlapped_armed) memset (&write_status, 0, sizeof (write_status));
PurgeComm (get_handle (), PURGE_TXABORT | PURGE_RXABORT); write_status.hEvent = CreateEvent (&sec_none_nih, TRUE, FALSE, NULL);
ResetEvent (io_status.hEvent); ProtectHandle (write_status.hEvent);
for (;;) for (;;)
{ {
overlapped_armed = TRUE; if (WriteFile (get_handle(), ptr, len, &bytes_written, &write_status))
if (WriteFile (get_handle(), ptr, len, &bytes_written, &io_status))
break; break;
switch (GetLastError ()) switch (GetLastError ())
@ -182,17 +182,19 @@ fhandler_serial::raw_write (const void *ptr, size_t len)
goto err; goto err;
} }
if (!GetOverlappedResult (get_handle (), &io_status, &bytes_written, TRUE)) if (!GetOverlappedResult (get_handle (), &write_status, &bytes_written, TRUE))
goto err; goto err;
break; break;
} }
overlapped_armed = FALSE; CloseHandle(write_status.hEvent);
return bytes_written; return bytes_written;
err: err:
__seterrno (); __seterrno ();
CloseHandle(write_status.hEvent);
return -1; return -1;
} }