@@ -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,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
593610static 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+
603630void
604631chunk_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
683717static 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+
699741static rtree_node_elm_t *
700742chunks_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