summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-08-17 22:08:06 -0400
committerNick Mathewson <nickm@torproject.org>2011-08-17 22:08:06 -0400
commitec670c15a7d7c41866edf45faf98448852257a4b (patch)
treeb9e02cea0b8ad3117139dc861c6d93e2f55d8bd9
parent3c63edd1f7ea1e26937466cf3ad16b7bf0e265e4 (diff)
parent04656ea85a1b6ec0fbe1fa126f8c81e9b17abab5 (diff)
downloadlibevent-ec670c15a7d7c41866edf45faf98448852257a4b.tar.gz
Merge remote-tracking branch 'origin/patches-2.0'
Conflict in buffer.c: the new file-segment logic conflicted with the solaris sendfile fix.
-rw-r--r--.gitignore1
-rw-r--r--buffer.c16
-rw-r--r--bufferevent-internal.h2
-rw-r--r--bufferevent_ratelim.c16
-rw-r--r--test/Makefile.am15
-rwxr-xr-xtest/rpcgen_wrapper.sh41
6 files changed, 80 insertions, 11 deletions
diff --git a/.gitignore b/.gitignore
index af03c72d..5b9e63a9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -87,6 +87,7 @@ libevent_openssl.pc
/test/regress
/test/regress.gen.c
/test/regress.gen.h
+/test/rpcgen-attempted
/test/test-eof
/test/test-init
/test/test-ratelim
diff --git a/buffer.c b/buffer.c
index df6402e8..d9ab22c8 100644
--- a/buffer.c
+++ b/buffer.c
@@ -2218,12 +2218,18 @@ evbuffer_write_sendfile(struct evbuffer *buffer, evutil_socket_t dest_fd,
}
return (res);
#elif defined(SENDFILE_IS_SOLARIS)
- res = sendfile(dest_fd, source_fd, &offset, chain->off);
- if (res == -1 && EVUTIL_ERR_RW_RETRIABLE(errno)) {
- /* if this is EAGAIN or EINTR return 0; otherwise, -1 */
- return (0);
+ {
+ const off_t offset_orig = offset;
+ res = sendfile(dest_fd, source_fd, &offset, chain->off);
+ if (res == -1 && EVUTIL_ERR_RW_RETRIABLE(errno)) {
+ if (offset - offset_orig)
+ return offset - offset_orig;
+ /* if this is EAGAIN or EINTR and no bytes were
+ * written, return 0 */
+ return (0);
+ }
+ return (res);
}
- return (res);
#endif
}
#endif
diff --git a/bufferevent-internal.h b/bufferevent-internal.h
index bbf17eba..bd08bdc9 100644
--- a/bufferevent-internal.h
+++ b/bufferevent-internal.h
@@ -99,6 +99,8 @@ struct bufferevent_rate_limit_group {
/** The smallest number of bytes that any member of the group should
* be limited to read or write at a time. */
ev_ssize_t min_share;
+ ev_ssize_t configured_min_share;
+
/** Timeout event that goes off once a tick, when the bucket is ready
* to refill. */
struct event master_refill_event;
diff --git a/bufferevent_ratelim.c b/bufferevent_ratelim.c
index 7e51c2e5..5867476c 100644
--- a/bufferevent_ratelim.c
+++ b/bufferevent_ratelim.c
@@ -637,13 +637,15 @@ bufferevent_rate_limit_group_new(struct event_base *base,
ev_token_bucket_init(&g->rate_limit, cfg, tick, 0);
- g->min_share = 64;
event_assign(&g->master_refill_event, base, -1, EV_PERSIST,
_bev_group_refill_callback, g);
/*XXXX handle event_add failure */
event_add(&g->master_refill_event, &cfg->tick_timeout);
EVTHREAD_ALLOC_LOCK(g->lock, EVTHREAD_LOCKTYPE_RECURSIVE);
+
+ bufferevent_rate_limit_group_set_min_share(g, 64);
+
return g;
}
@@ -671,6 +673,9 @@ bufferevent_rate_limit_group_set_cfg(
event_add(&g->master_refill_event, &cfg->tick_timeout);
}
+ /* The new limits might force us to adjust min_share differently. */
+ bufferevent_rate_limit_group_set_min_share(g, g->configured_min_share);
+
UNLOCK_GROUP(g);
return 0;
}
@@ -683,6 +688,15 @@ bufferevent_rate_limit_group_set_min_share(
if (share > EV_SSIZE_MAX)
return -1;
+ g->configured_min_share = share;
+
+ /* Can't set share to less than the one-tick maximum. IOW, at steady
+ * state, at least one connection can go per tick. */
+ if (share > g->rate_limit_cfg.read_rate)
+ share = g->rate_limit_cfg.read_rate;
+ if (share > g->rate_limit_cfg.write_rate)
+ share = g->rate_limit_cfg.write_rate;
+
g->min_share = share;
return 0;
}
diff --git a/test/Makefile.am b/test/Makefile.am
index 66e01ea3..bcda535c 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -2,7 +2,7 @@ AUTOMAKE_OPTIONS = foreign
AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/compat -I$(top_srcdir)/include -I../include -DTINYTEST_LOCAL
-EXTRA_DIST = regress.rpc regress.gen.h regress.gen.c test.sh
+EXTRA_DIST = regress.rpc regress.gen.h regress.gen.c rpcgen_wrapper.sh test.sh
noinst_PROGRAMS = test-init test-eof test-weof test-time \
bench bench_cascade bench_http bench_httpclient test-ratelim \
@@ -71,15 +71,20 @@ bench_http_LDADD = $(LIBEVENT_GC_SECTIONS) ../libevent.la
bench_httpclient_SOURCES = bench_httpclient.c
bench_httpclient_LDADD = $(LIBEVENT_GC_SECTIONS) ../libevent_core.la
-regress.gen.c regress.gen.h: regress.rpc $(top_srcdir)/event_rpcgen.py
- if $(top_srcdir)/event_rpcgen.py $(srcdir)/regress.rpc ; then \
- echo "HI"; \
+regress.gen.c regress.gen.h: rpcgen-attempted
+
+rpcgen-attempted: $(srcdir)/regress.rpc $(srcdir)/../event_rpcgen.py $(srcdir)/rpcgen_wrapper.sh
+ date -u > $@
+ if $(srcdir)/rpcgen_wrapper.sh $(srcdir); then \
+ echo "rpcgen okay"; \
else \
- echo "No Python installed; can't test RPC."; \
+ echo "No Python installed; stubbing out RPC test." >&2; \
echo " "> regress.gen.c; \
echo "#define NO_PYTHON_EXISTS" > regress.gen.h; \
fi
+CLEANFILES = rpcgen-attempted
+
DISTCLEANFILES = *~
verify: check
diff --git a/test/rpcgen_wrapper.sh b/test/rpcgen_wrapper.sh
new file mode 100755
index 00000000..a60331c9
--- /dev/null
+++ b/test/rpcgen_wrapper.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+# libevent rpcgen_wrapper.sh
+# Transforms event_rpcgen.py failure into success for make, only if
+# regress.gen.c and regress.gen.h already exist in $srcdir. This
+# is needed for "make distcheck" to pass the read-only $srcdir build,
+# as with read-only sources fresh from tarball, regress.gen.[ch] will
+# be correct in $srcdir but unwritable. This previously triggered
+# Makefile.am to create stub regress.gen.c and regress.gen.h in the
+# distcheck _build directory, which were then detected as leftover
+# files in the build tree after distclean, breaking distcheck.
+# Note that regress.gen.[ch] are not in fresh git clones, making
+# working Python a requirement for make distcheck of a git tree.
+
+exit_updated() {
+ echo "Updated ${srcdir}\regress.gen.c and ${srcdir}\regress.gen.h"
+ exit 0
+}
+
+exit_reuse() {
+ echo "event_rpcgen.py failed, ${srcdir}\regress.gen.\[ch\] will be reused." >&2
+ exit 0
+}
+
+exit_failed() {
+ echo "Could not generate regress.gen.\[ch\] using event_rpcgen.sh" >&2
+ exit 1
+}
+
+srcdir=$1
+srcdir=${srcdir:-.}
+${srcdir}/../event_rpcgen.py ${srcdir}/regress.rpc
+case "$?" in
+ 0)
+ exit_updated
+ ;;
+ *)
+ test -r ${srcdir}/regress.gen.c -a -r ${srcdir}/regress.gen.h && \
+ exit_reuse
+ exit_failed
+ ;;
+esac