summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/tcache.c2
-rw-r--r--test/unit/mallctl.c12
2 files changed, 13 insertions, 1 deletions
diff --git a/src/tcache.c b/src/tcache.c
index c7d4f78..9fe78c3 100644
--- a/src/tcache.c
+++ b/src/tcache.c
@@ -451,7 +451,7 @@ tcaches_create(tsd_t *tsd, unsigned *r_ind)
elm = tcaches_avail;
tcaches_avail = tcaches_avail->next;
elm->tcache = tcache;
- *r_ind = (elm - tcaches) / sizeof(tcaches_t);
+ *r_ind = elm - tcaches;
} else {
elm = &tcaches[tcaches_past];
elm->tcache = tcache;
diff --git a/test/unit/mallctl.c b/test/unit/mallctl.c
index 10a6fcd..5960496 100644
--- a/test/unit/mallctl.c
+++ b/test/unit/mallctl.c
@@ -258,6 +258,18 @@ TEST_BEGIN(test_tcache)
"Unexpected mallctl() failure, i=%u", i);
}
+ /* Exercise tcache ID recycling. */
+ for (i = 0; i < NTCACHES; i++) {
+ assert_d_eq(mallctl("tcache.destroy", NULL, NULL, &tis[i],
+ sizeof(unsigned)), 0, "Unexpected mallctl() failure, i=%u",
+ i);
+ }
+ for (i = 0; i < NTCACHES; i++) {
+ sz = sizeof(unsigned);
+ assert_d_eq(mallctl("tcache.create", &tis[i], &sz, NULL, 0), 0,
+ "Unexpected mallctl() failure, i=%u", i);
+ }
+
/* Flush empty tcaches. */
for (i = 0; i < NTCACHES; i++) {
assert_d_eq(mallctl("tcache.flush", NULL, NULL, &tis[i],