diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-02-20 12:55:59 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-02-20 12:55:59 -0500 |
commit | db08f640d543bd4ef32ffe1f83c8aeca77bb0ce0 (patch) | |
tree | ea621727aebf35c6835031be18c602072402944f | |
parent | 4faeaea90e5d7a5d76acd8891ba88d4ed099edbd (diff) | |
download | libevent-db08f640d543bd4ef32ffe1f83c8aeca77bb0ce0.tar.gz |
Suspend read/write on bufferevents during hostname lookup
When we're doing a lookup in preparation for doing a connect, we
might have an unconnected socket on hand, and mustn't actually do
any reading or writing with it.
-rw-r--r-- | bufferevent-internal.h | 3 | ||||
-rw-r--r-- | bufferevent_sock.c | 13 |
2 files changed, 14 insertions, 2 deletions
diff --git a/bufferevent-internal.h b/bufferevent-internal.h index ad1f844e..5be964fd 100644 --- a/bufferevent-internal.h +++ b/bufferevent-internal.h @@ -53,6 +53,9 @@ extern "C" { #define BEV_SUSPEND_BW 0x02 /* On a base bufferevent: when we have emptied the group's bandwidth bucket. */ #define BEV_SUSPEND_BW_GROUP 0x04 +/* On a socket bufferevent: can't do any operations while we're waiting for + * name lookup to finish. */ +#define BEV_SUSPEND_LOOKUP 0x08 struct bufferevent_rate_limit_group { /** List of all members in the group */ diff --git a/bufferevent_sock.c b/bufferevent_sock.c index 006c8ec5..df048de9 100644 --- a/bufferevent_sock.c +++ b/bufferevent_sock.c @@ -417,6 +417,9 @@ bufferevent_connect_getaddrinfo_cb(int result, struct evutil_addrinfo *ai, int r; BEV_LOCK(bev); + bufferevent_unsuspend_write(bev, BEV_SUSPEND_LOOKUP); + bufferevent_unsuspend_read(bev, BEV_SUSPEND_LOOKUP); + if (result != 0) { /* XXX Communicate the error somehow. */ _bufferevent_run_eventcb(bev, BEV_EVENT_ERROR); @@ -452,14 +455,20 @@ bufferevent_socket_connect_hostname(struct bufferevent *bev, hint.ai_protocol = IPPROTO_TCP; hint.ai_socktype = SOCK_STREAM; + bufferevent_suspend_write(bev, BEV_SUSPEND_LOOKUP); + bufferevent_suspend_read(bev, BEV_SUSPEND_LOOKUP); + bufferevent_incref(bev); err = evutil_getaddrinfo_async(evdns_base, hostname, portbuf, &hint, bufferevent_connect_getaddrinfo_cb, bev); - if (err == 0) + if (err == 0) { return 0; - else + } else { + bufferevent_unsuspend_write(bev, BEV_SUSPEND_LOOKUP); + bufferevent_unsuspend_read(bev, BEV_SUSPEND_LOOKUP); return -1; + } } /* |