bugfix: resend: fix serial_flush
Wolfgang Walter
wine at stwm.de
Mon Dec 22 19:17:07 CST 2008
On Monday 22 December 2008, Alexandre Julliard wrote:
> Wolfgang Walter <wine at stwm.de> writes:
>
> > @@ -201,7 +202,17 @@ static void serial_flush( struct fd *fd, struct event **event )
> > /* MSDN says: If hFile is a handle to a communications device,
> > * the function only flushes the transmit buffer.
> > */
> > - if (tcflush( get_unix_fd(fd), TCOFLUSH ) == -1) file_set_error();
> > + /* FlushFileBuffers does NOT have the semantics of tcflush.
> > + * Whereas tcflush discards any data not yet transmitted
> > + * FlushFileBuffers ensures they are written out.
> > + * The POSIX equivalent is tcdrain
> > + */
> > + while (tcdrain( get_unix_fd(fd)) == -1) {
> > + if (errno != EINTR) {
> > + file_set_error();
> > + return;
> > + }
>
> This will block, you can't do that in the server.
>
> --
> Alexandre Julliard
> julliard at winehq.org
>
>
Would it be acceptable to call tcdrain directly in NtFlushBuffersFile:
=================
NTSTATUS WINAPI NtFlushBuffersFile( HANDLE hFile, IO_STATUS_BLOCK* IoStatusBlock )
{
NTSTATUS ret;
HANDLE hEvent = NULL;
enum server_fd_type type;
NTSTATUS status;
unsigned int options;
int needs_close;
int unix_handle;
status = server_get_unix_fd( hFile, FILE_WRITE_DATA, &unix_handle,
&needs_close, &type, &options );
if (type == FD_TYPE_SERIAL) {
while (tcdrain(unix_handle) == -1) {
if (errno != EINTR) {
return FILE_GetNtStatus();
}
}
return STATUS_SUCCESS;
}
SERVER_START_REQ( flush_file )
{
req->handle = wine_server_obj_handle( hFile );
ret = wine_server_call( req );
hEvent = wine_server_ptr_handle( reply->event );
}
SERVER_END_REQ;
if (!ret && hEvent)
{
ret = NtWaitForSingleObject( hEvent, FALSE, NULL );
NtClose( hEvent );
}
return ret;
}
=================================
Regards,
--
Wolfgang Walter
Studentenwerk München
Anstalt des öffentlichen Rechts
Leiter EDV
Leopoldstraße 15
80802 München
More information about the wine-devel
mailing list