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:
parent
3aaa66f813
commit
747e88d3f6
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user