Skip to content

Commit b9014fa

Browse files
committed
Rename gcpage_t add jl_gc_page_t for the pages.
Replace `PAGE_INDEX` with inline function.
1 parent 97dc858 commit b9014fa

File tree

2 files changed

+40
-35
lines changed

2 files changed

+40
-35
lines changed

src/gc-debug.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// This file is a part of Julia. License is MIT: http://julialang.org/license
22

33
// Useful function in debugger to find page/region metadata
4-
gcpage_t *jl_gc_page_metadata(void *data)
4+
jl_gc_pagemeta_t *jl_gc_page_metadata(void *data)
55
{
66
return page_metadata(data);
77
}
@@ -27,11 +27,11 @@ JL_DLLEXPORT jl_taggedvalue_t *jl_gc_find_taggedvalue_pool(char *p, size_t *osiz
2727
if (p < page_begin)
2828
return NULL;
2929
size_t ofs = p - page_begin;
30-
int pg_idx = PAGE_INDEX(r, p);
30+
int pg_idx = page_index(r, page_begin);
3131
// Check if this is a free page
3232
if (r->freemap[pg_idx / 32] & (uint32_t)(1 << (pg_idx % 32)))
3333
return NULL;
34-
gcpage_t *pagemeta = &r->meta[pg_idx];
34+
jl_gc_pagemeta_t *pagemeta = &r->meta[pg_idx];
3535
int osize = pagemeta->osize;
3636
// Shouldn't be needed, just in case
3737
if (osize == 0)
@@ -163,7 +163,7 @@ static void clear_mark(int bits)
163163
if (!!~line) {
164164
for (int j = 0; j < 32; j++) {
165165
if (!((line >> j) & 1)) {
166-
gcpage_t *pg = page_metadata(&region->pages[pg_i*32 + j][0] + GC_PAGE_OFFSET);
166+
jl_gc_pagemeta_t *pg = page_metadata(region->pages[pg_i*32 + j].data + GC_PAGE_OFFSET);
167167
pool_t *pool;
168168
FOR_HEAP (pg->thread_n)
169169
pool = &pools[pg->pool_n];
@@ -410,7 +410,7 @@ static void gc_scrub_range(char *stack_lo, char *stack_hi)
410410
jl_taggedvalue_t *tag = jl_gc_find_taggedvalue_pool(p, &osize);
411411
if (osize <= sizeof_jl_taggedvalue_t || !tag || gc_marked(tag))
412412
continue;
413-
gcpage_t *pg = page_metadata(tag);
413+
jl_gc_pagemeta_t *pg = page_metadata(tag);
414414
// Make sure the sweep rebuild the freelist
415415
pg->allocd = 1;
416416
pg->gc_bits = 0x3;

src/gc.c

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ typedef struct _pool_t {
181181
#define GC_PAGE_OFFSET (JL_SMALL_BYTE_ALIGNMENT - (sizeof_jl_taggedvalue_t % JL_SMALL_BYTE_ALIGNMENT))
182182

183183
// pool page metadata
184-
typedef struct _gcpage_t {
184+
typedef struct {
185185
struct {
186186
uint16_t pool_n : 8; // index (into norm_pool) of pool that owns this page
187187
uint16_t allocd : 1; // true if an allocation happened in this page since last sweep
@@ -195,7 +195,7 @@ typedef struct _gcpage_t {
195195
uint16_t thread_n; // index (into jl_thread_heap) of heap that owns this page
196196
char *data;
197197
uint8_t *ages;
198-
} gcpage_t;
198+
} jl_gc_pagemeta_t;
199199

200200
#define PAGE_PFL_BEG(p) ((gcval_t**)((p->data) + (p)->fl_begin_offset))
201201
#define PAGE_PFL_END(p) ((gcval_t**)((p->data) + (p)->fl_end_offset))
@@ -211,15 +211,19 @@ typedef struct _gcpage_t {
211211
#endif
212212
#define REGION_COUNT 8
213213

214+
typedef struct {
215+
char data[GC_PAGE_SZ];
216+
} jl_gc_page_t;
217+
214218
typedef struct {
215219
// Page layout:
216220
// Padding: GC_PAGE_OFFSET
217221
// Blocks: osize * n
218222
// Tag: sizeof_jl_taggedvalue_t
219223
// Data: <= osize - sizeof_jl_taggedvalue_t
220-
char pages[REGION_PG_COUNT][GC_PAGE_SZ]; // must be first, to preserve page alignment
224+
jl_gc_page_t pages[REGION_PG_COUNT]; // must be first, to preserve page alignment
221225
uint32_t freemap[REGION_PG_COUNT/32];
222-
gcpage_t meta[REGION_PG_COUNT];
226+
jl_gc_pagemeta_t meta[REGION_PG_COUNT];
223227
} region_t
224228
#if !defined(_COMPILER_MICROSOFT_) && !(defined(_COMPILER_MINGW_) && defined(_COMPILER_CLANG_))
225229
__attribute__((aligned(GC_PAGE_SZ)))
@@ -336,14 +340,15 @@ static arraylist_t to_finalize;
336340
#define gc_marked(o) (((gcval_t*)(o))->gc_bits & GC_MARKED)
337341
#define _gc_setmark(o, mark_mode) (((gcval_t*)(o))->gc_bits = mark_mode)
338342

339-
static gcpage_t *page_metadata(void *data);
343+
static jl_gc_pagemeta_t *page_metadata(void *data);
340344
static void pre_mark(void);
341345
static void post_mark(arraylist_t *list, int dryrun);
342346
static region_t *find_region(void *ptr, int maybe);
343347

344-
#define PAGE_INDEX(region, data) \
345-
((GC_PAGE_DATA((data) - GC_PAGE_OFFSET) - \
346-
&(region)->pages[0][0])/GC_PAGE_SZ)
348+
STATIC_INLINE int page_index(region_t *region, void *data)
349+
{
350+
return (GC_PAGE_DATA(data) - region->pages->data) / GC_PAGE_SZ;
351+
}
347352

348353
NOINLINE static uintptr_t gc_get_stack_ptr(void)
349354
{
@@ -542,7 +547,7 @@ static region_t *find_region(void *ptr, int maybe)
542547
{
543548
// on 64bit systems we could probably use a single region and remove this loop
544549
for (int i = 0; i < REGION_COUNT && regions[i]; i++) {
545-
char *begin = &regions[i]->pages[0][0];
550+
char *begin = regions[i]->pages->data;
546551
char *end = begin + sizeof(regions[i]->pages);
547552
if ((char*)ptr >= begin && (char*)ptr <= end)
548553
return regions[i];
@@ -552,14 +557,14 @@ static region_t *find_region(void *ptr, int maybe)
552557
return NULL;
553558
}
554559

555-
static gcpage_t *page_metadata(void *data)
560+
static jl_gc_pagemeta_t *page_metadata(void *data)
556561
{
557562
region_t *r = find_region(data, 0);
558-
int pg_idx = PAGE_INDEX(r, (char*)data);
563+
int pg_idx = page_index(r, (char*)data - GC_PAGE_OFFSET);
559564
return &r->meta[pg_idx];
560565
}
561566

562-
static uint8_t *page_age(gcpage_t *pg)
567+
static uint8_t *page_age(jl_gc_pagemeta_t *pg)
563568
{
564569
return pg->ages;
565570
}
@@ -690,7 +695,7 @@ static inline int gc_setmark_pool(void *o, int mark_mode)
690695
return mark_mode;
691696
}
692697
#endif
693-
gcpage_t *page = page_metadata(o);
698+
jl_gc_pagemeta_t *page = page_metadata(o);
694699
int bits = gc_bits(o);
695700
if (bits == GC_QUEUED || bits == GC_MARKED) {
696701
mark_mode = GC_MARKED;
@@ -774,7 +779,7 @@ static NOINLINE void *malloc_page(void)
774779
}
775780
#ifdef _OS_WINDOWS_
776781
VirtualAlloc(region->freemap, REGION_PG_COUNT/8, MEM_COMMIT, PAGE_READWRITE);
777-
VirtualAlloc(region->meta, REGION_PG_COUNT*sizeof(gcpage_t), MEM_COMMIT, PAGE_READWRITE);
782+
VirtualAlloc(region->meta, REGION_PG_COUNT*sizeof(jl_gc_pagemeta_t), MEM_COMMIT, PAGE_READWRITE);
778783
#endif
779784
memset(region->freemap, 0xff, REGION_PG_COUNT/8);
780785
regions[region_i] = region;
@@ -809,7 +814,7 @@ static NOINLINE void *malloc_page(void)
809814
#endif
810815

811816
region->freemap[i] &= ~(uint32_t)(1 << j);
812-
ptr = region->pages[i*32 + j];
817+
ptr = region->pages[i*32 + j].data;
813818
#ifdef _OS_WINDOWS_
814819
VirtualAlloc(ptr, GC_PAGE_SZ, MEM_COMMIT, PAGE_READWRITE);
815820
#endif
@@ -824,7 +829,7 @@ static void free_page(void *p)
824829
int pg_idx = -1;
825830
int i;
826831
for(i = 0; i < REGION_COUNT && regions[i] != NULL; i++) {
827-
pg_idx = PAGE_INDEX(regions[i], (char*)p+GC_PAGE_OFFSET);
832+
pg_idx = page_index(regions[i], p);
828833
if (pg_idx >= 0 && pg_idx < REGION_PG_COUNT) break;
829834
}
830835
assert(i < REGION_COUNT && regions[i] != NULL);
@@ -839,8 +844,8 @@ static void free_page(void *p)
839844
// ensure so we don't release more memory than intended
840845
size_t n_pages = (GC_PAGE_SZ + jl_page_size - 1) / GC_PAGE_SZ;
841846
decommit_size = jl_page_size;
842-
p = (void*)((uintptr_t)&region->pages[pg_idx][0] & ~(jl_page_size - 1)); // round down to the nearest page
843-
pg_idx = PAGE_INDEX(region, (char*)p+GC_PAGE_OFFSET);
847+
p = (void*)((uintptr_t)region->pages[pg_idx].data & ~(jl_page_size - 1)); // round down to the nearest page
848+
pg_idx = page_index(region, p);
844849
if (pg_idx + n_pages > REGION_PG_COUNT) goto no_decommit;
845850
for (; n_pages--; pg_idx++) {
846851
msk = (uint32_t)(1 << ((pg_idx % 32)));
@@ -1080,7 +1085,7 @@ static void sweep_malloced_arrays(void)
10801085
}
10811086

10821087
// pool allocation
1083-
static inline gcval_t *reset_page(pool_t *p, gcpage_t *pg, gcval_t *fl)
1088+
static inline gcval_t *reset_page(pool_t *p, jl_gc_pagemeta_t *pg, gcval_t *fl)
10841089
{
10851090
pg->gc_bits = 0;
10861091
pg->nfree = (GC_PAGE_SZ - GC_PAGE_OFFSET) / p->osize;
@@ -1101,7 +1106,7 @@ static NOINLINE void add_page(pool_t *p)
11011106
char *data = (char*)malloc_page();
11021107
if (data == NULL)
11031108
jl_throw(jl_memory_exception);
1104-
gcpage_t *pg = page_metadata(data + GC_PAGE_OFFSET);
1109+
jl_gc_pagemeta_t *pg = page_metadata(data + GC_PAGE_OFFSET);
11051110
pg->data = data;
11061111
pg->osize = p->osize;
11071112
pg->ages = (uint8_t*)malloc(LLT_ALIGN(GC_PAGE_SZ / p->osize, 8));
@@ -1136,7 +1141,7 @@ static inline void *__pool_alloc(pool_t *p, int osize, int end_offset)
11361141
if (__unlikely(GC_PAGE_DATA(v) != GC_PAGE_DATA(next))) {
11371142
// we only update pg's fields when the freelist changes page
11381143
// since pg's metadata is likely not in cache
1139-
gcpage_t *pg = page_metadata(v);
1144+
jl_gc_pagemeta_t *pg = page_metadata(v);
11401145
assert(pg->osize == p->osize);
11411146
pg->nfree = 0;
11421147
pg->allocd = 1;
@@ -1157,7 +1162,7 @@ static inline void *__pool_alloc(pool_t *p, int osize, int end_offset)
11571162
}
11581163
else {
11591164
// like the freelist case, but only update the page metadata when it is full
1160-
gcpage_t *pg = page_metadata(v);
1165+
jl_gc_pagemeta_t *pg = page_metadata(v);
11611166
assert(pg->osize == p->osize);
11621167
pg->nfree = 0;
11631168
pg->allocd = 1;
@@ -1240,7 +1245,7 @@ static int total_pages = 0;
12401245
static int freed_pages = 0;
12411246
static int lazy_freed_pages = 0;
12421247
static int page_done = 0;
1243-
static gcval_t **sweep_page(pool_t *p, gcpage_t *pg, gcval_t **pfl,int,int);
1248+
static gcval_t **sweep_page(pool_t *p, jl_gc_pagemeta_t *pg, gcval_t **pfl,int,int);
12441249
static void sweep_pool_region(gcval_t ***pfl, int region_i, int sweep_mask)
12451250
{
12461251
region_t *region = regions[region_i];
@@ -1254,7 +1259,7 @@ static void sweep_pool_region(gcval_t ***pfl, int region_i, int sweep_mask)
12541259
ub = pg_i;
12551260
for (int j = 0; j < 32; j++) {
12561261
if (!((line >> j) & 1)) {
1257-
gcpage_t *pg = &region->meta[pg_i*32 + j];
1262+
jl_gc_pagemeta_t *pg = &region->meta[pg_i*32 + j];
12581263
int p_n = pg->pool_n;
12591264
int t_n = pg->thread_n;
12601265
pool_t *p = NULL;
@@ -1274,7 +1279,7 @@ static void sweep_pool_region(gcval_t ***pfl, int region_i, int sweep_mask)
12741279
}
12751280

12761281
// Returns pointer to terminal pointer of list rooted at *pfl.
1277-
static gcval_t **sweep_page(pool_t *p, gcpage_t *pg, gcval_t **pfl, int sweep_mask, int osize)
1282+
static gcval_t **sweep_page(pool_t *p, jl_gc_pagemeta_t *pg, gcval_t **pfl, int sweep_mask, int osize)
12781283
{
12791284
int freedall;
12801285
gcval_t **prev_pfl = pfl;
@@ -1375,7 +1380,7 @@ static gcval_t **sweep_page(pool_t *p, gcpage_t *pg, gcval_t **pfl, int sweep_ma
13751380
#endif
13761381
free_page(data);
13771382
#ifdef MEMDEBUG
1378-
memset(pg, 0xbb, sizeof(gcpage_t));
1383+
memset(pg, 0xbb, sizeof(jl_gc_pagemeta_t));
13791384
#endif
13801385
}
13811386
freed_pages++;
@@ -1438,7 +1443,7 @@ static int gc_sweep_inc(int sweep_mask)
14381443
pool_t *p = &pools[i];
14391444
gcval_t *last = p->freelist;
14401445
if (last) {
1441-
gcpage_t *pg = page_metadata(last);
1446+
jl_gc_pagemeta_t *pg = page_metadata(last);
14421447
pg->allocd = 1;
14431448
pg->nfree = p->nfree;
14441449
}
@@ -1447,7 +1452,7 @@ static int gc_sweep_inc(int sweep_mask)
14471452

14481453
last = p->newpages;
14491454
if (last) {
1450-
gcpage_t *pg = page_metadata(last);
1455+
jl_gc_pagemeta_t *pg = page_metadata(last);
14511456
pg->nfree = (GC_PAGE_SZ - ((char*)last - GC_PAGE_DATA(last))) / p->osize;
14521457
pg->allocd = 1;
14531458
}
@@ -2510,7 +2515,7 @@ void jl_gc_init(void)
25102515
static size_t pool_stats(pool_t *p, size_t *pwaste, size_t *np, size_t *pnold)
25112516
{
25122517
gcval_t *v;
2513-
gcpage_t *pg = p->pages;
2518+
jl_gc_pagemeta_t *pg = p->pages;
25142519
size_t osize = p->osize;
25152520
size_t nused=0, nfree=0, npgs=0, nold = 0;
25162521

@@ -2532,7 +2537,7 @@ static size_t pool_stats(pool_t *p, size_t *pwaste, size_t *np, size_t *pnold)
25322537
v = (gcval_t*)((char*)v + osize);
25332538
i++;
25342539
}
2535-
gcpage_t *nextpg = NULL;
2540+
jl_gc_pagemeta_t *nextpg = NULL;
25362541
pg = nextpg;
25372542
}
25382543
*pwaste = npgs * GC_PAGE_SZ - (nused * p->osize);

0 commit comments

Comments
 (0)