summaryrefslogtreecommitdiffstats
path: root/src/quarantine.c
diff options
context:
space:
mode:
authorJason Evans <jasone@canonware.com>2014-11-05 02:03:11 (GMT)
committerJason Evans <jasone@canonware.com>2014-11-05 02:03:11 (GMT)
commitc002a5c80058ee27acb234ef34f69b0cf6836836 (patch)
tree0c6b49ca2c734c194347b72dd0832154a2b840bc /src/quarantine.c
parent2b2f6dc1e45808c31fb2f3ae33306d224ec0b2d2 (diff)
downloadjemalloc-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.c22
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);
}