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