rename region_info to region_metadata
parent
a083ff79e1
commit
1190966846
34
malloc.c
34
malloc.c
|
@ -41,7 +41,7 @@ static union {
|
||||||
void *slab_region_start;
|
void *slab_region_start;
|
||||||
void *slab_region_end;
|
void *slab_region_end;
|
||||||
struct region_allocator *region_allocator;
|
struct region_allocator *region_allocator;
|
||||||
struct region_info *regions[2];
|
struct region_metadata *regions[2];
|
||||||
atomic_bool initialized;
|
atomic_bool initialized;
|
||||||
};
|
};
|
||||||
char padding[PAGE_SIZE];
|
char padding[PAGE_SIZE];
|
||||||
|
@ -530,7 +530,7 @@ static inline void deallocate_small(void *p, const size_t *expected_size) {
|
||||||
mutex_unlock(&c->lock);
|
mutex_unlock(&c->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct region_info {
|
struct region_metadata {
|
||||||
void *p;
|
void *p;
|
||||||
size_t size;
|
size_t size;
|
||||||
size_t guard_size;
|
size_t guard_size;
|
||||||
|
@ -546,7 +546,7 @@ static const size_t max_region_table_size = CLASS_REGION_SIZE / PAGE_SIZE;
|
||||||
|
|
||||||
struct region_allocator {
|
struct region_allocator {
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
struct region_info *regions;
|
struct region_metadata *regions;
|
||||||
size_t total;
|
size_t total;
|
||||||
size_t free;
|
size_t free;
|
||||||
struct quarantine_info quarantine_random[REGION_QUARANTINE_RANDOM_SIZE];
|
struct quarantine_info quarantine_random[REGION_QUARANTINE_RANDOM_SIZE];
|
||||||
|
@ -604,19 +604,19 @@ static size_t hash_page(void *p) {
|
||||||
static int regions_grow(void) {
|
static int regions_grow(void) {
|
||||||
struct region_allocator *ra = ro.region_allocator;
|
struct region_allocator *ra = ro.region_allocator;
|
||||||
|
|
||||||
if (ra->total > SIZE_MAX / sizeof(struct region_info) / 2) {
|
if (ra->total > SIZE_MAX / sizeof(struct region_metadata) / 2) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t newtotal = ra->total * 2;
|
size_t newtotal = ra->total * 2;
|
||||||
size_t newsize = newtotal * sizeof(struct region_info);
|
size_t newsize = newtotal * sizeof(struct region_metadata);
|
||||||
size_t mask = newtotal - 1;
|
size_t mask = newtotal - 1;
|
||||||
|
|
||||||
if (newtotal > max_region_table_size) {
|
if (newtotal > max_region_table_size) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct region_info *p = ra->regions == ro.regions[0] ?
|
struct region_metadata *p = ra->regions == ro.regions[0] ?
|
||||||
ro.regions[1] : ro.regions[0];
|
ro.regions[1] : ro.regions[0];
|
||||||
|
|
||||||
if (memory_protect_rw(p, newsize)) {
|
if (memory_protect_rw(p, newsize)) {
|
||||||
|
@ -634,7 +634,7 @@ static int regions_grow(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
memory_map_fixed(ra->regions, ra->total * sizeof(struct region_info));
|
memory_map_fixed(ra->regions, ra->total * sizeof(struct region_metadata));
|
||||||
ra->free = ra->free + ra->total;
|
ra->free = ra->free + ra->total;
|
||||||
ra->total = newtotal;
|
ra->total = newtotal;
|
||||||
ra->regions = p;
|
ra->regions = p;
|
||||||
|
@ -664,7 +664,7 @@ static int regions_insert(void *p, size_t size, size_t guard_size) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct region_info *regions_find(void *p) {
|
static struct region_metadata *regions_find(void *p) {
|
||||||
struct region_allocator *ra = ro.region_allocator;
|
struct region_allocator *ra = ro.region_allocator;
|
||||||
|
|
||||||
size_t mask = ra->total - 1;
|
size_t mask = ra->total - 1;
|
||||||
|
@ -677,7 +677,7 @@ static struct region_info *regions_find(void *p) {
|
||||||
return (r == p && r != NULL) ? &ra->regions[index] : NULL;
|
return (r == p && r != NULL) ? &ra->regions[index] : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void regions_delete(struct region_info *region) {
|
static void regions_delete(struct region_metadata *region) {
|
||||||
struct region_allocator *ra = ro.region_allocator;
|
struct region_allocator *ra = ro.region_allocator;
|
||||||
|
|
||||||
size_t mask = ra->total - 1;
|
size_t mask = ra->total - 1;
|
||||||
|
@ -765,7 +765,7 @@ COLD static void init_slow_path(void) {
|
||||||
}
|
}
|
||||||
ra->regions = ro.regions[0];
|
ra->regions = ro.regions[0];
|
||||||
ra->total = INITIAL_REGION_TABLE_SIZE;
|
ra->total = INITIAL_REGION_TABLE_SIZE;
|
||||||
if (memory_protect_rw(ra->regions, ra->total * sizeof(struct region_info))) {
|
if (memory_protect_rw(ra->regions, ra->total * sizeof(struct region_metadata))) {
|
||||||
fatal_error("failed to unprotect memory for regions table");
|
fatal_error("failed to unprotect memory for regions table");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -866,7 +866,7 @@ static void deallocate_large(void *p, const size_t *expected_size) {
|
||||||
struct region_allocator *ra = ro.region_allocator;
|
struct region_allocator *ra = ro.region_allocator;
|
||||||
|
|
||||||
mutex_lock(&ra->lock);
|
mutex_lock(&ra->lock);
|
||||||
struct region_info *region = regions_find(p);
|
struct region_metadata *region = regions_find(p);
|
||||||
if (region == NULL) {
|
if (region == NULL) {
|
||||||
fatal_error("invalid free");
|
fatal_error("invalid free");
|
||||||
}
|
}
|
||||||
|
@ -941,7 +941,7 @@ EXPORT void *h_realloc(void *old, size_t size) {
|
||||||
struct region_allocator *ra = ro.region_allocator;
|
struct region_allocator *ra = ro.region_allocator;
|
||||||
|
|
||||||
mutex_lock(&ra->lock);
|
mutex_lock(&ra->lock);
|
||||||
struct region_info *region = regions_find(old);
|
struct region_metadata *region = regions_find(old);
|
||||||
if (region == NULL) {
|
if (region == NULL) {
|
||||||
fatal_error("invalid realloc");
|
fatal_error("invalid realloc");
|
||||||
}
|
}
|
||||||
|
@ -968,7 +968,7 @@ EXPORT void *h_realloc(void *old, size_t size) {
|
||||||
regions_quarantine_deallocate_pages(new_guard_end, old_rounded_size - rounded_size, 0);
|
regions_quarantine_deallocate_pages(new_guard_end, old_rounded_size - rounded_size, 0);
|
||||||
|
|
||||||
mutex_lock(&ra->lock);
|
mutex_lock(&ra->lock);
|
||||||
struct region_info *region = regions_find(old);
|
struct region_metadata *region = regions_find(old);
|
||||||
if (region == NULL) {
|
if (region == NULL) {
|
||||||
fatal_error("invalid realloc");
|
fatal_error("invalid realloc");
|
||||||
}
|
}
|
||||||
|
@ -986,7 +986,7 @@ EXPORT void *h_realloc(void *old, size_t size) {
|
||||||
memory_unmap(guard_end, extra);
|
memory_unmap(guard_end, extra);
|
||||||
} else {
|
} else {
|
||||||
mutex_lock(&ra->lock);
|
mutex_lock(&ra->lock);
|
||||||
struct region_info *region = regions_find(old);
|
struct region_metadata *region = regions_find(old);
|
||||||
if (region == NULL) {
|
if (region == NULL) {
|
||||||
fatal_error("invalid realloc");
|
fatal_error("invalid realloc");
|
||||||
}
|
}
|
||||||
|
@ -1005,7 +1005,7 @@ EXPORT void *h_realloc(void *old, size_t size) {
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&ra->lock);
|
mutex_lock(&ra->lock);
|
||||||
struct region_info *region = regions_find(old);
|
struct region_metadata *region = regions_find(old);
|
||||||
if (region == NULL) {
|
if (region == NULL) {
|
||||||
fatal_error("invalid realloc");
|
fatal_error("invalid realloc");
|
||||||
}
|
}
|
||||||
|
@ -1166,7 +1166,7 @@ EXPORT size_t h_malloc_usable_size(void *p) {
|
||||||
|
|
||||||
struct region_allocator *ra = ro.region_allocator;
|
struct region_allocator *ra = ro.region_allocator;
|
||||||
mutex_lock(&ra->lock);
|
mutex_lock(&ra->lock);
|
||||||
struct region_info *region = regions_find(p);
|
struct region_metadata *region = regions_find(p);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
fatal_error("invalid malloc_usable_size");
|
fatal_error("invalid malloc_usable_size");
|
||||||
}
|
}
|
||||||
|
@ -1192,7 +1192,7 @@ EXPORT size_t h_malloc_object_size(void *p) {
|
||||||
|
|
||||||
struct region_allocator *ra = ro.region_allocator;
|
struct region_allocator *ra = ro.region_allocator;
|
||||||
mutex_lock(&ra->lock);
|
mutex_lock(&ra->lock);
|
||||||
struct region_info *region = regions_find(p);
|
struct region_metadata *region = regions_find(p);
|
||||||
size_t size = p == NULL ? SIZE_MAX : region->size;
|
size_t size = p == NULL ? SIZE_MAX : region->size;
|
||||||
mutex_unlock(&ra->lock);
|
mutex_unlock(&ra->lock);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue