aboutsummaryrefslogtreecommitdiff
path: root/src/or/main.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-11-24 22:59:37 -0500
committerNick Mathewson <nickm@torproject.org>2011-11-24 22:59:37 -0500
commitf634228a073965195c4088b66c1d5c4799c6eed2 (patch)
tree3113bac14b861247cc900851104ef8c246292477 /src/or/main.c
parent11221d0f17bf3ea6039249ad8b06b3a1afd6291d (diff)
parent6e6a6612966d7ea9ad3d89bb5073ef400539b2a7 (diff)
downloadtor-f634228a073965195c4088b66c1d5c4799c6eed2.tar
tor-f634228a073965195c4088b66c1d5c4799c6eed2.tar.gz
Merge remote-tracking branch 'public/feature4516'
Diffstat (limited to 'src/or/main.c')
-rw-r--r--src/or/main.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/or/main.c b/src/or/main.c
index 7008d388a..10b80a4dd 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -196,6 +196,26 @@ free_old_inbuf(connection_t *conn)
}
#endif
+#ifdef MS_WINDOWS
+/** Remove the kernel-space send and receive buffers for <b>s</b>. For use
+ * with IOCP only. */
+static int
+set_buffer_lengths_to_zero(tor_socket_t s)
+{
+ int zero = 0;
+ int r = 0;
+ if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, (void*)&zero, sizeof(zero))) {
+ log_warn(LD_NET, "Unable to clear SO_SNDBUF");
+ r = -1;
+ }
+ if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, (void*)&zero, sizeof(zero))) {
+ log_warn(LD_NET, "Unable to clear SO_RCVBUF");
+ r = -1;
+ }
+ return r;
+}
+#endif
+
/** Add <b>conn</b> to the array of connections that we can poll on. The
* connection's socket must be set; the connection starts out
* non-reading and non-writing.
@@ -216,6 +236,14 @@ connection_add_impl(connection_t *conn, int is_connecting)
#ifdef USE_BUFFEREVENTS
if (connection_type_uses_bufferevent(conn)) {
if (SOCKET_OK(conn->s) && !conn->linked) {
+
+#ifdef MS_WINDOWS
+ if (tor_libevent_using_iocp_bufferevents() &&
+ get_options()->UserspaceIOCPBuffers) {
+ set_buffer_lengths_to_zero(conn->s);
+ }
+#endif
+
conn->bufev = bufferevent_socket_new(
tor_libevent_get_base(),
conn->s,