From ff1f320ac826ec39ebe8a2088e11398a29471261 Mon Sep 17 00:00:00 2001 From: Martin Wilck Date: Fri, 26 Apr 2002 18:31:19 +0000 Subject: [PATCH] Fixed some bugs in my recently submitted patch series. --- dlls/winsock/socket.c | 2 +- files/file.c | 10 ---------- server/file.c | 11 +++++++++++ server/serial.c | 16 ++++++++++++++++ server/sock.c | 12 ++++++++---- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/dlls/winsock/socket.c b/dlls/winsock/socket.c index f8ba6c1cfde..072b2818044 100644 --- a/dlls/winsock/socket.c +++ b/dlls/winsock/socket.c @@ -2487,7 +2487,7 @@ INT WINAPI WSASendTo( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, goto error; } - iovec = WS_ALLOC ( dwBufferCount * sizeof (struct iovec) ); + iovec = HeapAlloc (GetProcessHeap(), 0, dwBufferCount * sizeof (struct iovec) ); if ( !iovec ) { diff --git a/files/file.c b/files/file.c index 65b264c9b2f..ef6dc52fa05 100644 --- a/files/file.c +++ b/files/file.c @@ -1562,11 +1562,6 @@ static BOOL FILE_ReadFileEx(HANDLE hFile, LPVOID buffer, DWORD bytesToRead, WARN ( "Couldn't get FD\n" ); return FALSE; } - if ( ! (flags & FD_FLAG_OVERLAPPED) ) { - WARN ( "fd is not overlapped\n" ); - SetLastError ( ERROR_INVALID_PARAMETER ); - goto error; - } ovp = (async_fileio*) HeapAlloc(GetProcessHeap(), 0, sizeof (async_fileio)); if(!ovp) @@ -1790,11 +1785,6 @@ static BOOL FILE_WriteFileEx(HANDLE hFile, LPCVOID buffer, DWORD bytesToWrite, TRACE( "Couldn't get FD\n" ); return FALSE; } - if ( ! (flags & FD_FLAG_OVERLAPPED) ) { - WARN ( "fd is not overlapped\n" ); - SetLastError ( ERROR_INVALID_PARAMETER ); - goto error; - } ovp = (async_fileio*) HeapAlloc(GetProcessHeap(), 0, sizeof (async_fileio)); if(!ovp) diff --git a/server/file.c b/server/file.c index 69082922736..cdfb58030c2 100644 --- a/server/file.c +++ b/server/file.c @@ -389,6 +389,8 @@ static void file_queue_async(struct object *obj, void *ptr, unsigned int status, if ( status == STATUS_PENDING ) { + struct pollfd pfd; + if ( !async ) async = create_async ( obj, current, ptr ); if ( !async ) @@ -397,6 +399,15 @@ static void file_queue_async(struct object *obj, void *ptr, unsigned int status, async->status = STATUS_PENDING; if ( !async->q ) async_insert( q, async ); + + /* Check if the new pending request can be served immediately */ + pfd.fd = obj->fd; + pfd.events = file_get_poll_events ( obj ); + pfd.revents = 0; + poll ( &pfd, 1, 0 ); + + if ( pfd.revents ) + file_poll_event ( obj, pfd.revents ); } else if ( async ) destroy_async ( async ); else set_error ( STATUS_INVALID_PARAMETER ); diff --git a/server/serial.c b/server/serial.c index 173c8c3f997..dd5f90c038b 100644 --- a/server/serial.c +++ b/server/serial.c @@ -21,6 +21,7 @@ */ #include "config.h" +#include "wine/port.h" #include #include @@ -282,6 +283,8 @@ static void serial_queue_async(struct object *obj, void *ptr, unsigned int statu if ( status == STATUS_PENDING ) { + struct pollfd pfd; + if ( !async ) async = create_async ( obj, current, ptr ); if ( !async ) @@ -293,6 +296,19 @@ static void serial_queue_async(struct object *obj, void *ptr, unsigned int statu async_add_timeout(async,timeout); async_insert(q, async); } + + /* Check if the new pending request can be served immediately */ + pfd.fd = obj->fd; + pfd.events = serial_get_poll_events ( obj ); + pfd.revents = 0; + poll ( &pfd, 1, 0 ); + + if ( pfd.revents ) + /* serial_poll_event() calls set_select_events() */ + serial_poll_event ( obj, pfd.revents ); + else + set_select_events ( obj, pfd.events ); + return; } else if ( async ) destroy_async ( async ); else set_error ( STATUS_INVALID_PARAMETER ); diff --git a/server/sock.c b/server/sock.c index d8362afcccd..b102a5b9816 100644 --- a/server/sock.c +++ b/server/sock.c @@ -250,7 +250,6 @@ static void sock_poll_event( struct object *obj, int event ) sock->errors[FD_CONNECT_BIT] = sock_error( sock->obj.fd ); if (debug_level) fprintf(stderr, "socket %d connection failure\n", sock->obj.fd); - set_select_events( &sock->obj, -1 ); } } else if (sock->state & FD_WINE_LISTENING) @@ -269,7 +268,6 @@ static void sock_poll_event( struct object *obj, int event ) sock->pmask |= FD_ACCEPT; sock->errors[FD_ACCEPT_BIT] = sock_error( sock->obj.fd ); sock->hmask |= FD_ACCEPT; - set_select_events( &sock->obj, -1 ); } } else { @@ -335,11 +333,17 @@ static void sock_poll_event( struct object *obj, int event ) if (debug_level) fprintf(stderr, "socket %d aborted by error %d, event: %x - removing from select loop\n", sock->obj.fd, sock->errors[FD_CLOSE_BIT], event); - set_select_events( &sock->obj, -1 ); } } - sock_reselect( sock ); + if ( sock->pmask & FD_CLOSE || event & (POLLERR|POLLHUP) ) + { + if ( debug_level ) + fprintf ( stderr, "removing socket %d from select loop\n", sock->obj.fd ); + set_select_events( &sock->obj, -1 ); + } + else + sock_reselect( sock ); /* wake up anyone waiting for whatever just happened */ if ( sock->pmask & sock->mask || sock->flags & FD_FLAG_OVERLAPPED ) sock_wake_up( sock, event );