Make evbase_priority_init() and evbase_get_npriorities() threadsafe

This commit is contained in:
Nick Mathewson 2011-10-11 09:50:57 -04:00
parent ee3a4ee880
commit 3c55b5ee0a

24
event.c
View File

@ -1028,14 +1028,17 @@ event_priority_init(int npriorities)
int int
event_base_priority_init(struct event_base *base, int npriorities) 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 if (N_ACTIVE_CALLBACKS(base) || npriorities < 1
|| npriorities >= EVENT_MAX_PRIORITIES) || npriorities >= EVENT_MAX_PRIORITIES)
return (-1); goto err;
if (npriorities == base->nactivequeues) if (npriorities == base->nactivequeues)
return (0); goto ok;
if (base->nactivequeues) { if (base->nactivequeues) {
mm_free(base->activequeues); 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)); mm_calloc(npriorities, sizeof(struct event_list));
if (base->activequeues == NULL) { if (base->activequeues == NULL) {
event_warn("%s: calloc", __func__); event_warn("%s: calloc", __func__);
return (-1); goto err;
} }
base->nactivequeues = npriorities; base->nactivequeues = npriorities;
@ -1055,13 +1058,22 @@ event_base_priority_init(struct event_base *base, int npriorities)
TAILQ_INIT(&base->activequeues[i]); TAILQ_INIT(&base->activequeues[i]);
} }
return (0); ok:
r = 0;
err:
EVBASE_RELEASE_LOCK(base, th_base_lock);
return (r);
} }
int int
event_base_get_npriorities(struct event_base *base) 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. */ /* Returns true iff we're currently watching any events. */