(Also sent directly to Alexandre)
OK, here's my proposed simple patch for the POLLHUP problem.
Alexandre may clean it up (e.g. remove details that his new poll routines
could take care of itself) however he see fit.
And I also threw in a line for an FD_OOB oversight, just in case.
Log:
Handle socket POLLERR/POLLHUP conditions properly.
Clear error field for OOB notifications.
Index: wine/server/sock.c
===================================================================
RCS file: /home/wine/wine/server/sock.c,v
retrieving revision 1.7
diff -u -r1.7 sock.c
--- wine/server/sock.c 2000/01/01 00:56:28 1.7
+++ wine/server/sock.c 2000/03/16 21:40:20
@@ -78,9 +78,19 @@
static void sock_reselect( struct sock *sock )
{
int ev = sock_get_poll_events( &sock->obj );
+ struct pollfd pfd;
+
if (debug_level)
fprintf(stderr,"sock_reselect(%d): new mask %x\n", sock->obj.fd, ev);
set_select_events( &sock->obj, ev );
+
+ /* check whether condition is satisfied already */
+ pfd.fd = sock->obj.fd;
+ pfd.events = ev;
+ pfd.revents = 0;
+ poll( &pfd, 1, 0 );
+ if (pfd.revents & (POLLIN|POLLOUT|POLLPRI))
+ sock_poll_event( &sock->obj, pfd.revents);
}
inline static int sock_error(int s)
@@ -163,6 +173,7 @@
{
sock->pmask |= FD_OOB;
sock->hmask |= FD_OOB;
+ sock->errors[FD_OOB_BIT] = 0;
if (debug_level)
fprintf(stderr, "socket %d got OOB data\n", sock->obj.fd);
}
@@ -178,7 +189,10 @@
}
}
- sock_reselect( sock );
+ if (event & (POLLERR|POLLHUP))
+ set_select_events( &sock->obj, -1 );
+ else
+ sock_reselect( sock );
/* wake up anyone waiting for whatever just happened */
emask = sock->pmask & sock->mask;
if (debug_level && emask)