Skip to content

Commit a9ab910

Browse files
committed
Load page count from region
1 parent 3d93685 commit a9ab910

File tree

3 files changed

+26
-20
lines changed

3 files changed

+26
-20
lines changed

src/gc-debug.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ static void clear_mark(int bits)
133133
region_t *region = &regions[h];
134134
if (!region->pages)
135135
break;
136-
for (int pg_i = 0; pg_i < REGION_PG_COUNT/32; pg_i++) {
136+
for (int pg_i = 0; pg_i < region->pg_cnt / 32; pg_i++) {
137137
uint32_t line = region->freemap[pg_i];
138138
if (!!~line) {
139139
for (int j = 0; j < 32; j++) {

src/gc.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -462,20 +462,20 @@ static NOINLINE void *malloc_page(void)
462462
region->meta = (jl_gc_pagemeta_t*)(mem + pages_sz +freemap_sz);
463463
region->lb = 0;
464464
region->ub = 0;
465+
region->pg_cnt = REGION_PG_COUNT;
465466
#ifdef _OS_WINDOWS_
466-
VirtualAlloc(region->freemap, REGION_PG_COUNT / 8,
467+
VirtualAlloc(region->freemap, region->pg_cnt / 8,
467468
MEM_COMMIT, PAGE_READWRITE);
468-
VirtualAlloc(region->meta,
469-
REGION_PG_COUNT * sizeof(jl_gc_pagemeta_t),
469+
VirtualAlloc(region->meta, region->pg_cnt * sizeof(jl_gc_pagemeta_t),
470470
MEM_COMMIT, PAGE_READWRITE);
471471
#endif
472-
memset(region->freemap, 0xff, REGION_PG_COUNT/8);
472+
memset(region->freemap, 0xff, region->pg_cnt / 8);
473473
}
474-
for (i = region->lb; i < REGION_PG_COUNT/32; i++) {
474+
for (i = region->lb; i < region->pg_cnt / 32; i++) {
475475
if (region->freemap[i])
476476
break;
477477
}
478-
if (i == REGION_PG_COUNT/32) {
478+
if (i == region->pg_cnt / 32) {
479479
// region full
480480
region_i++;
481481
continue;
@@ -516,12 +516,15 @@ static void free_page(void *p)
516516
{
517517
int pg_idx = -1;
518518
int i;
519-
for(i = 0; i < REGION_COUNT && regions[i].pages != NULL; i++) {
520-
pg_idx = page_index(&regions[i], p);
521-
if (pg_idx >= 0 && pg_idx < REGION_PG_COUNT) break;
519+
region_t *region = regions;
520+
for (i = 0; i < REGION_COUNT && regions[i].pages != NULL; i++) {
521+
region = &regions[i];
522+
pg_idx = page_index(region, p);
523+
if (pg_idx >= 0 && pg_idx < region->pg_cnt) {
524+
break;
525+
}
522526
}
523-
assert(i < REGION_COUNT && regions[i].pages != NULL);
524-
region_t *region = &regions[i];
527+
assert(i < REGION_COUNT && region->pages != NULL);
525528
uint32_t msk = (uint32_t)(1 << (pg_idx % 32));
526529
assert(!(region->freemap[pg_idx/32] & msk));
527530
region->freemap[pg_idx/32] ^= msk;
@@ -534,7 +537,7 @@ static void free_page(void *p)
534537
decommit_size = jl_page_size;
535538
p = (void*)((uintptr_t)region->pages[pg_idx].data & ~(jl_page_size - 1)); // round down to the nearest page
536539
pg_idx = page_index(region, p);
537-
if (pg_idx + n_pages > REGION_PG_COUNT) goto no_decommit;
540+
if (pg_idx + n_pages > region->pg_cnt) goto no_decommit;
538541
for (; n_pages--; pg_idx++) {
539542
msk = (uint32_t)(1 << ((pg_idx % 32)));
540543
if (!(region->freemap[pg_idx/32] & msk)) goto no_decommit;

src/gc.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,10 @@ typedef struct {
191191
// Blocks: osize * n
192192
// Tag: sizeof_jl_taggedvalue_t
193193
// Data: <= osize - sizeof_jl_taggedvalue_t
194-
jl_gc_page_t *pages; // [REGION_PG_COUNT] // must be first, to preserve page alignment
195-
uint32_t *freemap; // [REGION_PG_COUNT/32]
196-
jl_gc_pagemeta_t *meta; // [REGION_PG_COUNT]
194+
jl_gc_page_t *pages; // [pg_cnt]; must be first, to preserve page alignment
195+
uint32_t *freemap; // [pg_cnt / 32]
196+
jl_gc_pagemeta_t *meta; // [pg_cnt]
197+
int pg_cnt;
197198
// store a lower bound of the first free page in each region
198199
int lb;
199200
// an upper bound of the last non-free page
@@ -287,10 +288,12 @@ STATIC_INLINE region_t *find_region(void *ptr, int maybe)
287288
{
288289
// on 64bit systems we could probably use a single region and remove this loop
289290
for (int i = 0; i < REGION_COUNT && regions[i].pages; i++) {
290-
char *begin = regions[i].pages->data;
291-
char *end = begin + sizeof(jl_gc_page_t) * REGION_PG_COUNT;
292-
if ((char*)ptr >= begin && (char*)ptr <= end)
293-
return &regions[i];
291+
region_t *region = &regions[i];
292+
char *begin = region->pages->data;
293+
char *end = begin + region->pg_cnt * sizeof(jl_gc_page_t);
294+
if ((char*)ptr >= begin && (char*)ptr <= end) {
295+
return region;
296+
}
294297
}
295298
(void)maybe;
296299
assert(maybe && "find_region failed");

0 commit comments

Comments
 (0)