summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bufferevent_async.c4
-rw-r--r--bufferevent_ratelim.c2
-rw-r--r--evutil.c11
-rw-r--r--test/test-ratelim.c22
-rw-r--r--util-internal.h2
5 files changed, 38 insertions, 3 deletions
diff --git a/bufferevent_async.c b/bufferevent_async.c
index 2075301b..0e1e259d 100644
--- a/bufferevent_async.c
+++ b/bufferevent_async.c
@@ -325,7 +325,7 @@ read_complete(struct event_overlapped *eo, uintptr_t key,
if (ok && nbytes) {
BEV_RESET_GENERIC_READ_TIMEOUT(bev);
- _bufferevent_derement_read_buckets(&bev_a->bev, nbytes);
+ _bufferevent_decrement_read_buckets(&bev_a->bev, nbytes);
if (bev->readcb != NULL &&
evbuffer_get_length(bev->input) >= bev->wm_read.low)
_bufferevent_run_readcb(bev);
@@ -359,7 +359,7 @@ write_complete(struct event_overlapped *eo, uintptr_t key,
if (ok && nbytes) {
BEV_RESET_GENERIC_WRITE_TIMEOUT(bev);
- _bufferevent_derement_write_buckets(&bev_a->bev, nbytes);
+ _bufferevent_decrement_write_buckets(&bev_a->bev, nbytes);
if (bev->writecb != NULL &&
evbuffer_get_length(bev->output) <= bev->wm_write.low)
_bufferevent_run_writecb(bev);
diff --git a/bufferevent_ratelim.c b/bufferevent_ratelim.c
index 564367cb..968168ad 100644
--- a/bufferevent_ratelim.c
+++ b/bufferevent_ratelim.c
@@ -415,7 +415,7 @@ _bev_group_random_element(struct bufferevent_rate_limit_group *group)
EVUTIL_ASSERT(! TAILQ_EMPTY(&group->members));
- which = random() % group->n_members;
+ which = _evutil_weakrand() % group->n_members;
bev = TAILQ_FIRST(&group->members);
while (which--)
diff --git a/evutil.c b/evutil.c
index 800e40b2..8df742a7 100644
--- a/evutil.c
+++ b/evutil.c
@@ -1759,3 +1759,14 @@ evutil_getenv(const char *varname)
return getenv(varname);
}
+
+long
+_evutil_weakrand(void)
+{
+#ifdef WIN32
+ return rand();
+#else
+ return random();
+#endif
+}
+
diff --git a/test/test-ratelim.c b/test/test-ratelim.c
index 845e7504..59e3ecb1 100644
--- a/test/test-ratelim.c
+++ b/test/test-ratelim.c
@@ -30,6 +30,11 @@
#include <assert.h>
#include <math.h>
+#ifdef WIN32
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#endif
+
#include <event2/bufferevent.h>
#include <event2/buffer.h>
#include <event2/event.h>
@@ -63,7 +68,11 @@ loud_writecb(struct bufferevent *bev, void *ctx)
struct client_state *cs = ctx;
struct evbuffer *output = bufferevent_get_output(bev);
char buf[1024];
+#ifdef WIN32
+ int r = rand() % 256;
+#else
int r = random() % 256;
+#endif
memset(buf, r, sizeof(buf));
while (evbuffer_get_length(output) < 8192) {
evbuffer_add(output, buf, sizeof(buf));
@@ -285,6 +294,15 @@ main(int argc, char **argv)
int i,j;
double ratio;
+#ifdef WIN32
+ WORD wVersionRequested = MAKEWORD(2,2);
+ WSADATA wsaData;
+ int err;
+
+ err = WSAStartup(wVersionRequested, &wsaData);
+#endif
+
+
for (i = 1; i < argc; ++i) {
for (j = 0; options[j].name; ++j) {
if (!strcmp(argv[i],options[j].name)) {
@@ -315,7 +333,11 @@ main(int argc, char **argv)
{
struct timeval tv;
evutil_gettimeofday(&tv, NULL);
+#ifdef WIN32
+ srand(tv.tv_usec);
+#else
srandom(tv.tv_usec);
+#endif
}
evthread_enable_lock_debuging();
diff --git a/util-internal.h b/util-internal.h
index 36ec3239..509f7299 100644
--- a/util-internal.h
+++ b/util-internal.h
@@ -146,6 +146,8 @@ int evutil_resolve(int family, const char *hostname, struct sockaddr *sa,
const char *evutil_getenv(const char *name);
+long _evutil_weakrand(void);
+
/* Evaluates to the same boolean value as 'p', and hints to the compiler that
* we expect this value to be false. */
#ifdef __GNUC__X