diff options
author | Jason Evans <jasone@canonware.com> | 2014-11-05 02:03:11 (GMT) |
---|---|---|
committer | Jason Evans <jasone@canonware.com> | 2014-11-05 02:03:11 (GMT) |
commit | c002a5c80058ee27acb234ef34f69b0cf6836836 (patch) | |
tree | 0c6b49ca2c734c194347b72dd0832154a2b840bc /src/quarantine.c | |
parent | 2b2f6dc1e45808c31fb2f3ae33306d224ec0b2d2 (diff) | |
download | jemalloc-c002a5c80058ee27acb234ef34f69b0cf6836836.zip jemalloc-c002a5c80058ee27acb234ef34f69b0cf6836836.tar.gz jemalloc-c002a5c80058ee27acb234ef34f69b0cf6836836.tar.bz2 |
Fix two quarantine regressions.
Fix quarantine to actually update tsd when expanding, and to avoid
double initialization (leaking the first quarantine) due to recursive
initialization.
This resolves #161.
Diffstat (limited to 'src/quarantine.c')
-rw-r--r-- | src/quarantine.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/quarantine.c b/src/quarantine.c index 1301b47..aa1c3b0 100644 --- a/src/quarantine.c +++ b/src/quarantine.c @@ -24,6 +24,8 @@ quarantine_init(tsd_t *tsd, size_t lg_maxobjs) { quarantine_t *quarantine; + assert(tsd_nominal(tsd)); + quarantine = (quarantine_t *)imalloc(tsd, offsetof(quarantine_t, objs) + ((ZU(1) << lg_maxobjs) * sizeof(quarantine_obj_t))); if (quarantine == NULL) @@ -36,6 +38,25 @@ quarantine_init(tsd_t *tsd, size_t lg_maxobjs) return (quarantine); } +void +quarantine_alloc_hook_work(tsd_t *tsd) +{ + quarantine_t *quarantine; + + if (!tsd_nominal(tsd)) + return; + + quarantine = quarantine_init(tsd, LG_MAXOBJS_INIT); + /* + * Check again whether quarantine has been initialized, because + * qurantine_init() may have triggered recursive initialization. + */ + if (tsd_quarantine_get(tsd) == NULL) + tsd_quarantine_set(tsd, quarantine); + else + idalloc(tsd, quarantine); +} + static quarantine_t * quarantine_grow(tsd_t *tsd, quarantine_t *quarantine) { @@ -67,6 +88,7 @@ quarantine_grow(tsd_t *tsd, quarantine_t *quarantine) } idalloc(tsd, quarantine); + tsd_quarantine_set(tsd, ret); return (ret); } |