]> granicus.if.org Git - libevent/commitdiff
Do not ignore bufferevent_enable(EV_READ) before bufferevent_connect().
authorNick Mathewson <nickm@torproject.org>
Wed, 23 Dec 2009 12:48:43 +0000 (07:48 -0500)
committerNick Mathewson <nickm@torproject.org>
Wed, 23 Dec 2009 12:48:43 +0000 (07:48 -0500)
Previously, we weren't remembering that we wanted to re-add the read
event once the connect was finished.  Now we are.

bufferevent-internal.h
bufferevent_sock.c
test/regress_bufferevent.c

index a87a3c00b67e521afa311a9c579e7218df1d6267..6fd5c254842f79ae4ec620ac84701e42fa930da0 100644 (file)
@@ -50,6 +50,9 @@ extern "C" {
 #define BEV_SUSPEND_WM 0x01
 /* On a base bufferevent: when we have used up our bandwidth buckets. */
 #define BEV_SUSPEND_BW 0x02
+/* On a socket bufferevent: we aren't going to try reading until the
+ * connect operation is done. */
+#define BEV_SUSPEND_CONNECTING 0x04
 
 struct token_bucket {
        uint32_t limit;
index 44c8351c3c288477a24adfaf7b4a7e841f26aae0..61a369f6db6a635a92de3848ee59a6738b1bb24b 100644 (file)
@@ -212,6 +212,7 @@ bufferevent_writecb(evutil_socket_t fd, short event, void *arg)
                        goto done;
                } else {
                        connected = 1;
+                       bufferevent_unsuspend_read(bufev, BEV_SUSPEND_CONNECTING);
 #ifdef WIN32
                        if (BEV_IS_ASYNC(bufev)) {
                                event_del(&bufev->ev_write);
@@ -223,7 +224,8 @@ bufferevent_writecb(evutil_socket_t fd, short event, void *arg)
 #endif
                        _bufferevent_run_eventcb(bufev,
                                        BEV_EVENT_CONNECTED);
-                       if (!(bufev->enabled & EV_WRITE)) {
+                       if (!(bufev->enabled & EV_WRITE) ||
+                           bufev_p->write_suspended) {
                                event_del(&bufev->ev_write);
                                goto done;
                        }
@@ -391,6 +393,9 @@ freesock:
        /* do something about the error? */
 
 done:
+       if (result == 0)
+               bufferevent_suspend_read(bev, BEV_SUSPEND_CONNECTING);
+
        _bufferevent_decref_and_unlock(bev);
        return result;
 }
index d53b57b609778a7ff4987fb8d7d9c5dac90bc635..a1b5d18ee884ecbd5111b39c6b652001d71a1c0b 100644 (file)
@@ -491,12 +491,12 @@ test_bufferevent_connect(void *arg)
        bufferevent_setcb(bev1, NULL, NULL, reader_eventcb, data->base);
        bufferevent_setcb(bev2, NULL, NULL, reader_eventcb, data->base);
 
-       tt_want(!bufferevent_socket_connect(bev1, sa, sizeof(localhost)));
-       tt_want(!bufferevent_socket_connect(bev2, sa, sizeof(localhost)));
-
        bufferevent_enable(bev1, EV_READ);
        bufferevent_enable(bev2, EV_READ);
 
+       tt_want(!bufferevent_socket_connect(bev1, sa, sizeof(localhost)));
+       tt_want(!bufferevent_socket_connect(bev2, sa, sizeof(localhost)));
+
 #ifdef WIN32
        /* FIXME this is to get IOCP to work. it shouldn't be required. */
        {