Re: bugfix: resend: fix serial_flush

2008-12-23 Thread Alexandre Julliard
Wolfgang Walter w...@stwm.de writes:

 Would it be acceptable to call tcdrain directly in NtFlushBuffersFile:

Yes, something like that.

-- 
Alexandre Julliard
julli...@winehq.org




Re: bugfix: resend: fix serial_flush

2008-12-22 Thread Alexandre Julliard
Wolfgang Walter w...@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
julli...@winehq.org




Re: bugfix: resend: fix serial_flush

2008-12-22 Thread Wolfgang Walter
On Monday 22 December 2008, Alexandre Julliard wrote:
 Wolfgang Walter w...@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
 julli...@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