]> granicus.if.org Git - libevent/commitdiff
Make evbase_priority_init() and evbase_get_npriorities() threadsafe
authorNick Mathewson <nickm@torproject.org>
Tue, 11 Oct 2011 13:50:57 +0000 (09:50 -0400)
committerNick Mathewson <nickm@torproject.org>
Tue, 11 Oct 2011 13:50:57 +0000 (09:50 -0400)
event.c

diff --git a/event.c b/event.c
index 3790f8158374f834109c7f479b59fa788b4e3f3d..9064f8914771fb21c5701c169e575f3302ef2f91 100644 (file)
--- a/event.c
+++ b/event.c
@@ -1028,14 +1028,17 @@ event_priority_init(int npriorities)
 int
 event_base_priority_init(struct event_base *base, int npriorities)
 {
-       int i;
+       int i, r;
+       r = -1;
+
+       EVBASE_ACQUIRE_LOCK(base, th_base_lock);
 
        if (N_ACTIVE_CALLBACKS(base) || npriorities < 1
            || npriorities >= EVENT_MAX_PRIORITIES)
-               return (-1);
+               goto err;
 
        if (npriorities == base->nactivequeues)
-               return (0);
+               goto ok;
 
        if (base->nactivequeues) {
                mm_free(base->activequeues);
@@ -1047,7 +1050,7 @@ event_base_priority_init(struct event_base *base, int npriorities)
          mm_calloc(npriorities, sizeof(struct event_list));
        if (base->activequeues == NULL) {
                event_warn("%s: calloc", __func__);
-               return (-1);
+               goto err;
        }
        base->nactivequeues = npriorities;
 
@@ -1055,13 +1058,22 @@ event_base_priority_init(struct event_base *base, int npriorities)
                TAILQ_INIT(&base->activequeues[i]);
        }
 
-       return (0);
+ok:
+       r = 0;
+err:
+       EVBASE_RELEASE_LOCK(base, th_base_lock);
+       return (r);
 }
 
 int
 event_base_get_npriorities(struct event_base *base)
 {
-       return (base->nactivequeues);
+
+       int n;
+       EVBASE_ACQUIRE_LOCK(base, th_base_lock);
+       n = base->nactivequeues;
+       EVBASE_RELEASE_LOCK(base, th_base_lock);
+       return (n);
 }
 
 /* Returns true iff we're currently watching any events. */