ntdll: Call tcdrain for serial handles from NtFlushBuffersFile.
This commit is contained in:
parent
d35c67becd
commit
f93a5d2560
|
@ -66,6 +66,9 @@
|
|||
#ifdef HAVE_SYS_STATFS_H
|
||||
# include <sys/statfs.h>
|
||||
#endif
|
||||
#ifdef HAVE_TERMIOS_H
|
||||
#include <termios.h>
|
||||
#endif
|
||||
#ifdef HAVE_VALGRIND_MEMCHECK_H
|
||||
# include <valgrind/memcheck.h>
|
||||
#endif
|
||||
|
@ -2749,7 +2752,24 @@ NTSTATUS WINAPI NtFlushBuffersFile( HANDLE hFile, IO_STATUS_BLOCK* IoStatusBlock
|
|||
{
|
||||
NTSTATUS ret;
|
||||
HANDLE hEvent = NULL;
|
||||
enum server_fd_type type;
|
||||
int fd, needs_close;
|
||||
|
||||
ret = server_get_unix_fd( hFile, FILE_WRITE_DATA, &fd, &needs_close, &type, NULL );
|
||||
|
||||
if (!ret && type == FD_TYPE_SERIAL)
|
||||
{
|
||||
while (tcdrain( fd ) == -1)
|
||||
{
|
||||
if (errno != EINTR)
|
||||
{
|
||||
ret = FILE_GetNtStatus();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
SERVER_START_REQ( flush_file )
|
||||
{
|
||||
req->handle = wine_server_obj_handle( hFile );
|
||||
|
@ -2762,6 +2782,9 @@ NTSTATUS WINAPI NtFlushBuffersFile( HANDLE hFile, IO_STATUS_BLOCK* IoStatusBlock
|
|||
ret = NtWaitForSingleObject( hEvent, FALSE, NULL );
|
||||
NtClose( hEvent );
|
||||
}
|
||||
}
|
||||
|
||||
if (needs_close) close( fd );
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -61,7 +61,6 @@ static struct fd *serial_get_fd( struct object *obj );
|
|||
static void serial_destroy(struct object *obj);
|
||||
|
||||
static enum server_fd_type serial_get_fd_type( struct fd *fd );
|
||||
static void serial_flush( struct fd *fd, struct event **event );
|
||||
static void serial_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
|
||||
|
||||
struct serial
|
||||
|
@ -107,7 +106,7 @@ static const struct fd_ops serial_fd_ops =
|
|||
{
|
||||
default_fd_get_poll_events, /* get_poll_events */
|
||||
default_poll_event, /* poll_event */
|
||||
serial_flush, /* flush */
|
||||
no_flush, /* flush */
|
||||
serial_get_fd_type, /* get_fd_type */
|
||||
default_fd_ioctl, /* ioctl */
|
||||
serial_queue_async, /* queue_async */
|
||||
|
@ -196,14 +195,6 @@ static void serial_queue_async( struct fd *fd, const async_data_t *data, int typ
|
|||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
DECL_HANDLER(get_serial_info)
|
||||
{
|
||||
struct serial *serial;
|
||||
|
|
Loading…
Reference in New Issue