diff options
-rw-r--r-- | src/or/connection.c | 28 | ||||
-rw-r--r-- | src/or/connection.h | 3 | ||||
-rw-r--r-- | src/or/main.c | 14 |
3 files changed, 38 insertions, 7 deletions
diff --git a/src/or/connection.c b/src/or/connection.c index 3788348cd2..54b9911391 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -183,6 +183,21 @@ conn_state_to_string(int type, int state) return buf; } +#ifdef USE_BUFFEREVENTS +/** Return true iff the connection's type is one that can use a + bufferevent-based implementation. */ +int +connection_type_uses_bufferevent(connection_t *conn) +{ + switch (conn->type) { + case CONN_TYPE_AP: + return 1; + default: + return 0; + } +} +#endif + /** Allocate and return a new dir_connection_t, initialized as by * connection_init(). */ dir_connection_t * @@ -308,7 +323,10 @@ connection_init(time_t now, connection_t *conn, int type, int socket_family) conn->type = type; conn->socket_family = socket_family; - if (!connection_is_listener(conn)) { /* listeners never use their buf */ + if (!connection_is_listener(conn)) { + /* listeners never use their buf */ + /* XXX and bufferevents don't either, but for now we leave this here + * so that linked connections can still work. */ conn->inbuf = buf_new(); conn->outbuf = buf_new(); } @@ -3566,8 +3584,8 @@ assert_connection_ok(connection_t *conn, time_t now) if (conn->bufev) { tor_assert(conn->read_event == NULL); tor_assert(conn->write_event == NULL); - /* XXX reinstate tor_assert(conn->inbuf == NULL); - tor_assert(conn->outbuf == NULL);*/ + tor_assert(conn->inbuf == NULL); + tor_assert(conn->outbuf == NULL); } #endif @@ -3609,10 +3627,10 @@ assert_connection_ok(connection_t *conn, time_t now) * marked_for_close. */ /* buffers */ - if (!connection_is_listener(conn)) { + if (conn->inbuf) assert_buf_ok(conn->inbuf); + if (conn->outbuf) assert_buf_ok(conn->outbuf); - } if (conn->type == CONN_TYPE_OR) { or_connection_t *or_conn = TO_OR_CONN(conn); diff --git a/src/or/connection.h b/src/or/connection.h index 906f9ba874..af21481156 100644 --- a/src/or/connection.h +++ b/src/or/connection.h @@ -134,7 +134,10 @@ void connection_dump_buffer_mem_stats(int severity); void remove_file_if_very_old(const char *fname, time_t now); #ifdef USE_BUFFEREVENTS +int connection_type_uses_bufferevent(connection_t *conn); void connection_configure_bufferevent_callbacks(connection_t *conn); +#else +#define connection_type_uses_bufferevent(c) (0) #endif #endif diff --git a/src/or/main.c b/src/or/main.c index 85c99fffc3..18473c3b50 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -173,12 +173,22 @@ connection_add(connection_t *conn) smartlist_add(connection_array, conn); #ifdef USE_BUFFEREVENTS - if (conn->type == CONN_TYPE_AP && conn->s >= 0 && !conn->linked) { + if (connection_type_uses_bufferevent(conn) && + conn->s >= 0 && !conn->linked) { conn->bufev = bufferevent_socket_new( tor_libevent_get_base(), conn->s, BEV_OPT_DEFER_CALLBACKS); - + if (conn->inbuf) { + /* XXX Instead we should assert that there is no inbuf, once we + * have linked connections using bufferevents. */ + tor_assert(conn->outbuf); + tor_assert(buf_datalen(conn->inbuf) == 0); + tor_assert(buf_datalen(conn->outbuf) == 0); + buf_free(conn->inbuf); + buf_free(conn->outbuf); + conn->inbuf = conn->outbuf = NULL; + } connection_configure_bufferevent_callbacks(conn); } #endif |