Skip to content

Commit 673f12f

Browse files
committed
Flip freemap (and rename to allocmap)
Remove the `memset(0xff)` when allocating a region.
1 parent dfb704b commit 673f12f

File tree

4 files changed

+24
-22
lines changed

4 files changed

+24
-22
lines changed

src/gc-debug.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ JL_DLLEXPORT jl_taggedvalue_t *jl_gc_find_taggedvalue_pool(char *p, size_t *osiz
3737
size_t ofs = p - page_begin;
3838
int pg_idx = page_index(r, page_begin);
3939
// Check if this is a free page
40-
if (r->freemap[pg_idx / 32] & (uint32_t)(1 << (pg_idx % 32)))
40+
if (!(r->allocmap[pg_idx / 32] & (uint32_t)(1 << (pg_idx % 32))))
4141
return NULL;
4242
jl_gc_pagemeta_t *pagemeta = &r->meta[pg_idx];
4343
int osize = pagemeta->osize;
@@ -134,10 +134,10 @@ static void clear_mark(int bits)
134134
if (!region->pages)
135135
break;
136136
for (int pg_i = 0; pg_i < region->pg_cnt / 32; pg_i++) {
137-
uint32_t line = region->freemap[pg_i];
138-
if (!!~line) {
137+
uint32_t line = region->allocmap[pg_i];
138+
if (line) {
139139
for (int j = 0; j < 32; j++) {
140-
if (!((line >> j) & 1)) {
140+
if ((line >> j) & 1) {
141141
jl_gc_pagemeta_t *pg = page_metadata(region->pages[pg_i*32 + j].data + GC_PAGE_OFFSET);
142142
jl_tls_states_t *ptls =
143143
jl_all_task_states[pg->thread_n].ptls;

src/gc-pages.c

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ static void jl_gc_alloc_region(region_t *region)
7777
{
7878
int pg_cnt = region_pg_cnt;
7979
const size_t pages_sz = sizeof(jl_gc_page_t) * pg_cnt;
80-
const size_t freemap_sz = sizeof(uint32_t) * pg_cnt / 32;
80+
const size_t allocmap_sz = sizeof(uint32_t) * pg_cnt / 32;
8181
char *mem = NULL;
8282
while (1) {
8383
if (__likely((mem = jl_gc_try_alloc_region(pg_cnt))))
@@ -95,17 +95,16 @@ static void jl_gc_alloc_region(region_t *region)
9595
}
9696
}
9797
region->pages = (jl_gc_page_t*)mem;
98-
region->freemap = (uint32_t*)(mem + pages_sz);
99-
region->meta = (jl_gc_pagemeta_t*)(mem + pages_sz +freemap_sz);
98+
region->allocmap = (uint32_t*)(mem + pages_sz);
99+
region->meta = (jl_gc_pagemeta_t*)(mem + pages_sz +allocmap_sz);
100100
region->lb = 0;
101101
region->ub = 0;
102102
region->pg_cnt = pg_cnt;
103103
#ifdef _OS_WINDOWS_
104-
VirtualAlloc(region->freemap, pg_cnt / 8, MEM_COMMIT, PAGE_READWRITE);
104+
VirtualAlloc(region->allocmap, pg_cnt / 8, MEM_COMMIT, PAGE_READWRITE);
105105
VirtualAlloc(region->meta, pg_cnt * sizeof(jl_gc_pagemeta_t),
106106
MEM_COMMIT, PAGE_READWRITE);
107107
#endif
108-
memset(region->freemap, 0xff, pg_cnt / 8);
109108
}
110109

111110
NOINLINE void *jl_gc_alloc_page(void)
@@ -119,7 +118,7 @@ NOINLINE void *jl_gc_alloc_page(void)
119118
if (region->pages == NULL)
120119
jl_gc_alloc_region(region);
121120
for (i = region->lb; i < region->pg_cnt / 32; i++) {
122-
if (region->freemap[i])
121+
if (~region->allocmap[i])
123122
break;
124123
}
125124
if (i == region->pg_cnt / 32) {
@@ -139,15 +138,15 @@ NOINLINE void *jl_gc_alloc_page(void)
139138
region->ub = i;
140139

141140
#if defined(_COMPILER_MINGW_)
142-
int j = __builtin_ffs(region->freemap[i]) - 1;
141+
int j = __builtin_ffs(~region->allocmap[i]) - 1;
143142
#elif defined(_COMPILER_MICROSOFT_)
144143
unsigned long j;
145-
_BitScanForward(&j, region->freemap[i]);
144+
_BitScanForward(&j, ~region->allocmap[i]);
146145
#else
147-
int j = ffs(region->freemap[i]) - 1;
146+
int j = ffs(~region->allocmap[i]) - 1;
148147
#endif
149148

150-
region->freemap[i] &= ~(uint32_t)(1 << j);
149+
region->allocmap[i] |= (uint32_t)(1 << j);
151150
void *ptr = region->pages[i * 32 + j].data;
152151
#ifdef _OS_WINDOWS_
153152
VirtualAlloc(ptr, GC_PAGE_SZ, MEM_COMMIT, PAGE_READWRITE);
@@ -174,8 +173,8 @@ void jl_gc_free_page(void *p)
174173
}
175174
assert(i < REGION_COUNT && region->pages != NULL);
176175
uint32_t msk = (uint32_t)(1 << (pg_idx % 32));
177-
assert(!(region->freemap[pg_idx/32] & msk));
178-
region->freemap[pg_idx/32] ^= msk;
176+
assert(region->allocmap[pg_idx/32] & msk);
177+
region->allocmap[pg_idx/32] ^= msk;
179178
free(region->meta[pg_idx].ages);
180179
// tell the OS we don't need these pages right now
181180
size_t decommit_size = GC_PAGE_SZ;
@@ -185,10 +184,13 @@ void jl_gc_free_page(void *p)
185184
decommit_size = jl_page_size;
186185
p = (void*)((uintptr_t)region->pages[pg_idx].data & ~(jl_page_size - 1)); // round down to the nearest page
187186
pg_idx = page_index(region, p);
188-
if (pg_idx + n_pages > region->pg_cnt) goto no_decommit;
187+
if (pg_idx + n_pages > region->pg_cnt)
188+
goto no_decommit;
189189
for (; n_pages--; pg_idx++) {
190190
msk = (uint32_t)(1 << ((pg_idx % 32)));
191-
if (!(region->freemap[pg_idx/32] & msk)) goto no_decommit;
191+
if (region->allocmap[pg_idx / 32] & msk) {
192+
goto no_decommit;
193+
}
192194
}
193195
}
194196
#ifdef _OS_WINDOWS_

src/gc.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -806,11 +806,11 @@ static void sweep_pool_region(gcval_t ***pfl, int region_i, int sweep_mask)
806806
int ub = 0;
807807
int lb = region->lb;
808808
for (int pg_i = 0; pg_i <= region->ub; pg_i++) {
809-
uint32_t line = region->freemap[pg_i];
810-
if (!!~line) {
809+
uint32_t line = region->allocmap[pg_i];
810+
if (line) {
811811
ub = pg_i;
812812
for (int j = 0; j < 32; j++) {
813-
if (!((line >> j) & 1)) {
813+
if ((line >> j) & 1) {
814814
jl_gc_pagemeta_t *pg = &region->meta[pg_i*32 + j];
815815
int p_n = pg->pool_n;
816816
int t_n = pg->thread_n;

src/gc.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ typedef struct {
177177
// Tag: sizeof_jl_taggedvalue_t
178178
// Data: <= osize - sizeof_jl_taggedvalue_t
179179
jl_gc_page_t *pages; // [pg_cnt]; must be first, to preserve page alignment
180-
uint32_t *freemap; // [pg_cnt / 32]
180+
uint32_t *allocmap; // [pg_cnt / 32]
181181
jl_gc_pagemeta_t *meta; // [pg_cnt]
182182
int pg_cnt;
183183
// store a lower bound of the first free page in each region

0 commit comments

Comments
 (0)