From d8164d0cfc5eda8101ad08008e3f3de2032b26a9 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Wed, 21 Oct 2009 07:00:14 +0000 Subject: [PATCH] Fix win32 connect() event handling. Christopher Davis reported: Connection failures aren't reported on Windows when using bufferevent_socket_connect, because Windows uses select's exceptfds to notify of failure, and libevent treats them like read events. Only the write event handler is currently used to handle connection events. We should think hard about this one, since it changes behavior from 1.4.x. Anything that worked on Mac/Unix before will work more consistently on Windows now... but this might break stuff that worked only on Windows, but nowhere else. Patch from Chris Davis. svn:r1454 --- ChangeLog | 1 + WIN32-Code/win32.c | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index f896936a..944818e7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -30,6 +30,7 @@ Changes in 2.0.3-alpha: o Fix compilation for listener.h for C++ - missing extern "C". Patch from Ferenc Szalai. o Make the event_base_loop() family of functions respect thread-safety better. This should clear up a few hard-to-debug race conditions. o Fix a bug when using a specialized memory allocator on win32. + o Have the win32 select() backend label TCP-socket-connected events as EV_WRITE, not EV_READ. This should bring it in line with the other backends, and improve portability. Patch from Christopher Davis. Changes in 2.0.2-alpha: diff --git a/WIN32-Code/win32.c b/WIN32-Code/win32.c index 3b0e808c..d01b9591 100644 --- a/WIN32-Code/win32.c +++ b/WIN32-Code/win32.c @@ -296,7 +296,7 @@ win32_dispatch(struct event_base *base, struct timeval *tv) } fd_set_copy(win32op->readset_out, win32op->readset_in); - fd_set_copy(win32op->exset_out, win32op->readset_in); + fd_set_copy(win32op->exset_out, win32op->writeset_in); fd_set_copy(win32op->writeset_out, win32op->writeset_in); fd_count = @@ -343,7 +343,7 @@ win32_dispatch(struct event_base *base, struct timeval *tv) if (++i >= win32op->exset_out->fd_count) i = 0; s = win32op->exset_out->fd_array[i]; - evmap_io_active(base, s, EV_READ); + evmap_io_active(base, s, EV_WRITE); } } if (win32op->writeset_out->fd_count) { -- 2.50.1