1234370Sjasone#define JEMALLOC_RTREE_C_ 2234370Sjasone#include "jemalloc/internal/jemalloc_internal.h" 3234370Sjasone 4234370Sjasonertree_t * 5234370Sjasonertree_new(unsigned bits) 6234370Sjasone{ 7234370Sjasone rtree_t *ret; 8234370Sjasone unsigned bits_per_level, height, i; 9234370Sjasone 10234370Sjasone bits_per_level = ffs(pow2_ceil((RTREE_NODESIZE / sizeof(void *)))) - 1; 11234370Sjasone height = bits / bits_per_level; 12234370Sjasone if (height * bits_per_level != bits) 13234370Sjasone height++; 14234370Sjasone assert(height * bits_per_level >= bits); 15234370Sjasone 16234370Sjasone ret = (rtree_t*)base_alloc(offsetof(rtree_t, level2bits) + 17234370Sjasone (sizeof(unsigned) * height)); 18234370Sjasone if (ret == NULL) 19234370Sjasone return (NULL); 20234370Sjasone memset(ret, 0, offsetof(rtree_t, level2bits) + (sizeof(unsigned) * 21234370Sjasone height)); 22234370Sjasone 23234370Sjasone if (malloc_mutex_init(&ret->mutex)) { 24234370Sjasone /* Leak the rtree. */ 25234370Sjasone return (NULL); 26234370Sjasone } 27234370Sjasone ret->height = height; 28234370Sjasone if (bits_per_level * height > bits) 29234370Sjasone ret->level2bits[0] = bits % bits_per_level; 30234370Sjasone else 31234370Sjasone ret->level2bits[0] = bits_per_level; 32234370Sjasone for (i = 1; i < height; i++) 33234370Sjasone ret->level2bits[i] = bits_per_level; 34234370Sjasone 35234370Sjasone ret->root = (void**)base_alloc(sizeof(void *) << ret->level2bits[0]); 36234370Sjasone if (ret->root == NULL) { 37234370Sjasone /* 38234370Sjasone * We leak the rtree here, since there's no generic base 39234370Sjasone * deallocation. 40234370Sjasone */ 41234370Sjasone return (NULL); 42234370Sjasone } 43234370Sjasone memset(ret->root, 0, sizeof(void *) << ret->level2bits[0]); 44234370Sjasone 45234370Sjasone return (ret); 46234370Sjasone} 47242844Sjasone 48242844Sjasonevoid 49242844Sjasonertree_prefork(rtree_t *rtree) 50242844Sjasone{ 51242844Sjasone 52242844Sjasone malloc_mutex_prefork(&rtree->mutex); 53242844Sjasone} 54242844Sjasone 55242844Sjasonevoid 56242844Sjasonertree_postfork_parent(rtree_t *rtree) 57242844Sjasone{ 58242844Sjasone 59242844Sjasone malloc_mutex_postfork_parent(&rtree->mutex); 60242844Sjasone} 61242844Sjasone 62242844Sjasonevoid 63242844Sjasonertree_postfork_child(rtree_t *rtree) 64242844Sjasone{ 65242844Sjasone 66242844Sjasone malloc_mutex_postfork_child(&rtree->mutex); 67242844Sjasone} 68