Skip to content

Commit 09d7bdb

Browse files
committed
Propagate tsdn to default chunk hooks.
This avoids bootstrapping issues for configurations that require allocation during tsd initialization. This resolves jemalloc#390.
1 parent f70a254 commit 09d7bdb

File tree

1 file changed

+62
-20
lines changed

1 file changed

+62
-20
lines changed

src/chunk.c

Lines changed: 62 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -421,15 +421,11 @@ chunk_arena_get(tsdn_t *tsdn, unsigned arena_ind)
421421
}
422422

423423
static void *
424-
chunk_alloc_default(void *new_addr, size_t size, size_t alignment, bool *zero,
425-
bool *commit, unsigned arena_ind)
424+
chunk_alloc_default_impl(tsdn_t *tsdn, arena_t *arena, void *new_addr,
425+
size_t size, size_t alignment, bool *zero, bool *commit)
426426
{
427427
void *ret;
428-
tsdn_t *tsdn;
429-
arena_t *arena;
430428

431-
tsdn = tsdn_fetch();
432-
arena = chunk_arena_get(tsdn, arena_ind);
433429
ret = chunk_alloc_core(tsdn, arena, new_addr, size, alignment, zero,
434430
commit, arena->dss_prec);
435431
if (ret == NULL)
@@ -440,6 +436,20 @@ chunk_alloc_default(void *new_addr, size_t size, size_t alignment, bool *zero,
440436
return (ret);
441437
}
442438

439+
static void *
440+
chunk_alloc_default(void *new_addr, size_t size, size_t alignment, bool *zero,
441+
bool *commit, unsigned arena_ind)
442+
{
443+
tsdn_t *tsdn;
444+
arena_t *arena;
445+
446+
tsdn = tsdn_fetch();
447+
arena = chunk_arena_get(tsdn, arena_ind);
448+
449+
return (chunk_alloc_default_impl(tsdn, arena, new_addr, size, alignment,
450+
zero, commit));
451+
}
452+
443453
static void *
444454
chunk_alloc_retained(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
445455
void *new_addr, size_t size, size_t alignment, bool *zero, bool *commit)
@@ -472,8 +482,15 @@ chunk_alloc_wrapper(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
472482
ret = chunk_alloc_retained(tsdn, arena, chunk_hooks, new_addr, size,
473483
alignment, zero, commit);
474484
if (ret == NULL) {
475-
ret = chunk_hooks->alloc(new_addr, size, alignment, zero,
476-
commit, arena->ind);
485+
if (chunk_hooks->alloc == chunk_alloc_default) {
486+
/* Call directly to propagate tsdn. */
487+
ret = chunk_alloc_default_impl(tsdn, arena, new_addr,
488+
size, alignment, zero, commit);
489+
} else {
490+
ret = chunk_hooks->alloc(new_addr, size, alignment,
491+
zero, commit, arena->ind);
492+
}
493+
477494
if (ret == NULL)
478495
return (NULL);
479496
}
@@ -591,19 +608,30 @@ chunk_dalloc_cache(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
591608
}
592609

593610
static bool
594-
chunk_dalloc_default(void *chunk, size_t size, bool committed,
595-
unsigned arena_ind)
611+
chunk_dalloc_default_impl(tsdn_t *tsdn, void *chunk, size_t size)
596612
{
597613

598-
if (!have_dss || !chunk_in_dss(tsdn_fetch(), chunk))
614+
if (!have_dss || !chunk_in_dss(tsdn, chunk))
599615
return (chunk_dalloc_mmap(chunk, size));
600616
return (true);
601617
}
602618

619+
static bool
620+
chunk_dalloc_default(void *chunk, size_t size, bool committed,
621+
unsigned arena_ind)
622+
{
623+
tsdn_t *tsdn;
624+
625+
tsdn = tsdn_fetch();
626+
627+
return (chunk_dalloc_default_impl(tsdn, chunk, size));
628+
}
629+
603630
void
604631
chunk_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
605632
void *chunk, size_t size, bool zeroed, bool committed)
606633
{
634+
bool err;
607635

608636
assert(chunk != NULL);
609637
assert(CHUNK_ADDR2BASE(chunk) == chunk);
@@ -612,7 +640,13 @@ chunk_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
612640

613641
chunk_hooks_assure_initialized(tsdn, arena, chunk_hooks);
614642
/* Try to deallocate. */
615-
if (!chunk_hooks->dalloc(chunk, size, committed, arena->ind))
643+
if (chunk_hooks->dalloc == chunk_dalloc_default) {
644+
/* Call directly to propagate tsdn. */
645+
err = chunk_dalloc_default_impl(tsdn, chunk, size);
646+
} else
647+
err = chunk_hooks->dalloc(chunk, size, committed, arena->ind);
648+
649+
if (!err)
616650
return;
617651
/* Try to decommit; purge if that fails. */
618652
if (committed) {
@@ -681,26 +715,34 @@ chunk_split_default(void *chunk, size_t size, size_t size_a, size_t size_b,
681715
}
682716

683717
static bool
684-
chunk_merge_default(void *chunk_a, size_t size_a, void *chunk_b, size_t size_b,
685-
bool committed, unsigned arena_ind)
718+
chunk_merge_default_impl(tsdn_t *tsdn, void *chunk_a, void *chunk_b)
686719
{
687720

688721
if (!maps_coalesce)
689722
return (true);
690-
if (have_dss) {
691-
tsdn_t *tsdn = tsdn_fetch();
692-
if (chunk_in_dss(tsdn, chunk_a) != chunk_in_dss(tsdn, chunk_b))
693-
return (true);
694-
}
723+
if (have_dss && chunk_in_dss(tsdn, chunk_a) != chunk_in_dss(tsdn,
724+
chunk_b))
725+
return (true);
695726

696727
return (false);
697728
}
698729

730+
static bool
731+
chunk_merge_default(void *chunk_a, size_t size_a, void *chunk_b, size_t size_b,
732+
bool committed, unsigned arena_ind)
733+
{
734+
tsdn_t *tsdn;
735+
736+
tsdn = tsdn_fetch();
737+
738+
return (chunk_merge_default_impl(tsdn, chunk_a, chunk_b));
739+
}
740+
699741
static rtree_node_elm_t *
700742
chunks_rtree_node_alloc(size_t nelms)
701743
{
702744

703-
return ((rtree_node_elm_t *)base_alloc(tsdn_fetch(), nelms *
745+
return ((rtree_node_elm_t *)base_alloc(TSDN_NULL, nelms *
704746
sizeof(rtree_node_elm_t)));
705747
}
706748

0 commit comments

Comments
 (0)