From: Niels Provos Date: Thu, 25 Dec 2008 09:22:13 +0000 (+0000) Subject: we cannot realloc memory used by TAILQ; instead malloc each slot individually X-Git-Tag: release-2.0.1-alpha~198 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=30cba6d0b3a7d3de4bfdc3a939729b73d36a2a49;p=libevent we cannot realloc memory used by TAILQ; instead malloc each slot individually svn:r977 --- diff --git a/event-internal.h b/event-internal.h index 7bf4ca58..1255d931 100644 --- a/event-internal.h +++ b/event-internal.h @@ -60,7 +60,7 @@ struct eventop { /* used to map multiple events to the same underlying identifier */ struct event_map { - void *entries; + void **entries; int nentries; }; diff --git a/evmap.c b/evmap.c index 28832671..1a753bc3 100644 --- a/evmap.c +++ b/evmap.c @@ -56,8 +56,7 @@ #include "evmap.h" #include "mm-internal.h" -#define GET_SLOT(map, slot, type) \ - (struct type *)((char *)(map)->entries + (slot)*(sizeof(struct type))) +#define GET_SLOT(map, slot, type) (struct type *)((map)->entries[slot]) static int evmap_make_space( @@ -66,17 +65,20 @@ evmap_make_space( if (map->nentries <= slot) { int i; int nentries = map->nentries ? map->nentries : 32; - void *tmp; + void **tmp; while (nentries <= slot) nentries <<= 1; - tmp = mm_realloc(map->entries, nentries * msize); + tmp = (void **)mm_realloc(map->entries, nentries * msize); if (tmp == NULL) return (-1); - for (i = map->nentries; i < nentries; ++i) - (*ctor)((char *)tmp + i * msize); + for (i = map->nentries; i < nentries; ++i) { + tmp[i] = mm_malloc(msize); + assert(tmp[i] != NULL); + (*ctor)(tmp[i]); + } map->nentries = nentries; map->entries = tmp; @@ -91,6 +93,9 @@ evmap_clear(struct event_map *ctx) { ctx->nentries = 0; if (ctx->entries != NULL) { + int i; + for (i = 0; i < ctx->nentries; ++i) + mm_free(ctx->entries[i]); mm_free(ctx->entries); ctx->entries = NULL; }