]> granicus.if.org Git - libevent/commitdiff
Fix compilation of rate-limiting code on win32.
authorNick Mathewson <nickm@torproject.org>
Wed, 30 Dec 2009 19:29:56 +0000 (14:29 -0500)
committerNick Mathewson <nickm@torproject.org>
Wed, 30 Dec 2009 19:29:56 +0000 (14:29 -0500)
bufferevent_async.c
bufferevent_ratelim.c
evutil.c
test/test-ratelim.c
util-internal.h

index 2075301b763b8e25b6b4cc6b866d91ff807584f0..0e1e259dc285eaffed575b678ec2cd4598c0434c 100644 (file)
@@ -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);
index 564367cb2e78455e1599a367a1dd0455b3af82bc..968168adf8ef4d0de34c6e9023d935b942f93ba2 100644 (file)
@@ -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--)
index 800e40b2db0c1d3aea0a11a64bf5ce7750757819..8df742a775319f46c76235f6d9b5fe31d37ae321 100644 (file)
--- 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
+}
+
index 845e7504908079fef22408f6d3e2a6f8b958ca68..59e3ecb128b379b5c6c3a2c5f7f0952ee640e650 100644 (file)
 #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();
index 36ec3239306c1ebdcd52aff7b24c2df9e734238a..509f72997a7959c4f66f407af662e260d388bce1 100644 (file)
@@ -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