[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: [Libevent-users] Bug in win32_dispatch?
On Wed, May 13, 2015 at 05:32:51PM +0300, Alexey Simak wrote:
> Hi,
>
> We are using libevent in the next scenario:
>
> 1) Create nonblocking socket.
> 2) Call "connect()" on it.
> 3) Create an event for socket and wait in event_base_dispatch() for
> socket events.
> 4) Check for EV_TIMEOUT, EV_READ or EV_WRITE passed to callback.
>
> There is a problem on win32:
>
> When we are connecting to a destination that is not listening on the
> socket, we receive
> EV_WRITE event, which is not correct from my point of view.
>
> The problem is in win32_dispatch from win32select.c:
>
>
> res = select(fd_count,
> (struct fd_set*)win32op->readset_out,
> (struct fd_set*)win32op->writeset_out,
> (struct fd_set*)win32op->exset_out, tv);
>
> EVBASE_ACQUIRE_LOCK(base, th_base_lock);
>
> event_debug(("%s: select returned %d", __func__, res));
>
> if (res <= 0) {
> return res;
> }
>
> if (win32op->readset_out->fd_count) {
> i = rand() % win32op->readset_out->fd_count;
> for (j=0; j<win32op->readset_out->fd_count; ++j) {
> if (++i >= win32op->readset_out->fd_count)
> i = 0;
> s = win32op->readset_out->fd_array[i];
> evmap_io_active(base, s, EV_READ);
> }
> }
> if (win32op->exset_out->fd_count) {
> i = rand() % win32op->exset_out->fd_count;
> for (j=0; j<win32op->exset_out->fd_count; ++j) {
> if (++i >= win32op->exset_out->fd_count)
> i = 0;
> s = win32op->exset_out->fd_array[i];
> evmap_io_active(base, s, EV_WRITE);
> }
> }
> if (win32op->writeset_out->fd_count) {
> SOCKET s;
> i = rand() % win32op->writeset_out->fd_count;
> for (j=0; j<win32op->writeset_out->fd_count; ++j) {
> if (++i >= win32op->writeset_out->fd_count)
> i = 0;
> s = win32op->writeset_out->fd_array[i];
> evmap_io_active(base, s, EV_WRITE);
> }
> }
> return (0);
>
>
> As you see, EV_WRITE is returned if there is some socket error.
>
> Is this behaviour a bug or "as designed"?
What version are you using?
(I created a ticket for this here: https://github.com/libevent/libevent/issues/248)
***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users in the body.