Refactor kq_init error handling.

svn:r1467
This commit is contained in:
Nick Mathewson 2009-10-27 04:03:58 +00:00
parent ed0e91e02a
commit 369aafc4d7

View File

@ -115,8 +115,8 @@ static const struct eventop kqsigops = {
static void * static void *
kq_init(struct event_base *base) kq_init(struct event_base *base)
{ {
int kq; int kq = -1;
struct kqop *kqueueop; struct kqop *kqueueop = NULL;
if (!(kqueueop = mm_calloc(1, sizeof(struct kqop)))) if (!(kqueueop = mm_calloc(1, sizeof(struct kqop))))
return (NULL); return (NULL);
@ -125,8 +125,7 @@ kq_init(struct event_base *base)
if ((kq = kqueue()) == -1) { if ((kq = kqueue()) == -1) {
event_warn("kqueue"); event_warn("kqueue");
mm_free (kqueueop); goto err;
return (NULL);
} }
kqueueop->kq = kq; kqueueop->kq = kq;
@ -135,23 +134,14 @@ kq_init(struct event_base *base)
/* Initialize fields */ /* Initialize fields */
kqueueop->changes = mm_malloc(NEVENT * sizeof(struct kevent)); kqueueop->changes = mm_malloc(NEVENT * sizeof(struct kevent));
if (kqueueop->changes == NULL) { if (kqueueop->changes == NULL)
mm_free (kqueueop); goto err;
return (NULL);
}
kqueueop->pend_changes = mm_malloc(NEVENT * sizeof(struct kevent)); kqueueop->pend_changes = mm_malloc(NEVENT * sizeof(struct kevent));
if (kqueueop->pend_changes == NULL) { if (kqueueop->pend_changes == NULL)
mm_free (kqueueop->changes); goto err;
mm_free (kqueueop);
return (NULL);
}
kqueueop->events = mm_malloc(NEVENT * sizeof(struct kevent)); kqueueop->events = mm_malloc(NEVENT * sizeof(struct kevent));
if (kqueueop->events == NULL) { if (kqueueop->events == NULL)
mm_free (kqueueop->changes); goto err;
mm_free (kqueueop->pend_changes);
mm_free (kqueueop);
return (NULL);
}
kqueueop->events_size = kqueueop->changes_size = kqueueop->events_size = kqueueop->changes_size =
kqueueop->pend_changes_size = NEVENT; kqueueop->pend_changes_size = NEVENT;
@ -169,17 +159,22 @@ kq_init(struct event_base *base)
kqueueop->events[0].ident != -1 || kqueueop->events[0].ident != -1 ||
kqueueop->events[0].flags != EV_ERROR) { kqueueop->events[0].flags != EV_ERROR) {
event_warn("%s: detected broken kqueue; not using.", __func__); event_warn("%s: detected broken kqueue; not using.", __func__);
mm_free(kqueueop->changes); goto err;
mm_free(kqueueop->events);
mm_free(kqueueop);
close(kq);
return (NULL);
} }
base->evsigsel = &kqsigops; base->evsigsel = &kqsigops;
base->evsigbase = kqueueop; base->evsigbase = kqueueop;
return (kqueueop); return (kqueueop);
err:
if (kqueueop->changes)
mm_free(kqueueop->changes);
if (kqueueop->pend_changes)
mm_free(kqueueop->pend_changes);
if (kq >= 0)
close(kq);
mm_free(kqueueop);
return (NULL);
} }
static int static int