On Monday 22 December 2008, Alexandre Julliard wrote:
Wolfgang Walter wine@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@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,