@@ -421,15 +421,11 @@ chunk_arena_get(tsdn_t *tsdn, unsigned arena_ind)
421421}
422422
423423static 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+
443453static void *
444454chunk_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,14 +482,23 @@ 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 );
496+
497+ if (config_valgrind && chunk_hooks -> alloc !=
498+ chunk_alloc_default )
499+ JEMALLOC_VALGRIND_MAKE_MEM_UNDEFINED (ret , chunksize );
479500 }
480501
481- if (config_valgrind && chunk_hooks -> alloc != chunk_alloc_default )
482- JEMALLOC_VALGRIND_MAKE_MEM_UNDEFINED (ret , chunksize );
483502 return (ret );
484503}
485504
@@ -591,19 +610,30 @@ chunk_dalloc_cache(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
591610}
592611
593612static bool
594- chunk_dalloc_default (void * chunk , size_t size , bool committed ,
595- unsigned arena_ind )
613+ chunk_dalloc_default_impl (tsdn_t * tsdn , void * chunk , size_t size )
596614{
597615
598- if (!have_dss || !chunk_in_dss (tsdn_fetch () , chunk ))
616+ if (!have_dss || !chunk_in_dss (tsdn , chunk ))
599617 return (chunk_dalloc_mmap (chunk , size ));
600618 return (true);
601619}
602620
621+ static bool
622+ chunk_dalloc_default (void * chunk , size_t size , bool committed ,
623+ unsigned arena_ind )
624+ {
625+ tsdn_t * tsdn ;
626+
627+ tsdn = tsdn_fetch ();
628+
629+ return (chunk_dalloc_default_impl (tsdn , chunk , size ));
630+ }
631+
603632void
604633chunk_dalloc_wrapper (tsdn_t * tsdn , arena_t * arena , chunk_hooks_t * chunk_hooks ,
605634 void * chunk , size_t size , bool zeroed , bool committed )
606635{
636+ bool err ;
607637
608638 assert (chunk != NULL );
609639 assert (CHUNK_ADDR2BASE (chunk ) == chunk );
@@ -612,7 +642,13 @@ chunk_dalloc_wrapper(tsdn_t *tsdn, arena_t *arena, chunk_hooks_t *chunk_hooks,
612642
613643 chunk_hooks_assure_initialized (tsdn , arena , chunk_hooks );
614644 /* Try to deallocate. */
615- if (!chunk_hooks -> dalloc (chunk , size , committed , arena -> ind ))
645+ if (chunk_hooks -> dalloc == chunk_dalloc_default ) {
646+ /* Call directly to propagate tsdn. */
647+ err = chunk_dalloc_default_impl (tsdn , chunk , size );
648+ } else
649+ err = chunk_hooks -> dalloc (chunk , size , committed , arena -> ind );
650+
651+ if (!err )
616652 return ;
617653 /* Try to decommit; purge if that fails. */
618654 if (committed ) {
@@ -681,26 +717,34 @@ chunk_split_default(void *chunk, size_t size, size_t size_a, size_t size_b,
681717}
682718
683719static 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 )
720+ chunk_merge_default_impl (tsdn_t * tsdn , void * chunk_a , void * chunk_b )
686721{
687722
688723 if (!maps_coalesce )
689724 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- }
725+ if (have_dss && chunk_in_dss (tsdn , chunk_a ) != chunk_in_dss (tsdn ,
726+ chunk_b ))
727+ return (true);
695728
696729 return (false);
697730}
698731
732+ static bool
733+ chunk_merge_default (void * chunk_a , size_t size_a , void * chunk_b , size_t size_b ,
734+ bool committed , unsigned arena_ind )
735+ {
736+ tsdn_t * tsdn ;
737+
738+ tsdn = tsdn_fetch ();
739+
740+ return (chunk_merge_default_impl (tsdn , chunk_a , chunk_b ));
741+ }
742+
699743static rtree_node_elm_t *
700744chunks_rtree_node_alloc (size_t nelms )
701745{
702746
703- return ((rtree_node_elm_t * )base_alloc (tsdn_fetch () , nelms *
747+ return ((rtree_node_elm_t * )base_alloc (TSDN_NULL , nelms *
704748 sizeof (rtree_node_elm_t )));
705749}
706750
0 commit comments