@@ -77,7 +77,7 @@ static void jl_gc_alloc_region(region_t *region)
77
77
{
78
78
int pg_cnt = region_pg_cnt ;
79
79
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 ;
81
81
char * mem = NULL ;
82
82
while (1 ) {
83
83
if (__likely ((mem = jl_gc_try_alloc_region (pg_cnt ))))
@@ -95,17 +95,16 @@ static void jl_gc_alloc_region(region_t *region)
95
95
}
96
96
}
97
97
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 );
100
100
region -> lb = 0 ;
101
101
region -> ub = 0 ;
102
102
region -> pg_cnt = pg_cnt ;
103
103
#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 );
105
105
VirtualAlloc (region -> meta , pg_cnt * sizeof (jl_gc_pagemeta_t ),
106
106
MEM_COMMIT , PAGE_READWRITE );
107
107
#endif
108
- memset (region -> freemap , 0xff , pg_cnt / 8 );
109
108
}
110
109
111
110
NOINLINE void * jl_gc_alloc_page (void )
@@ -119,7 +118,7 @@ NOINLINE void *jl_gc_alloc_page(void)
119
118
if (region -> pages == NULL )
120
119
jl_gc_alloc_region (region );
121
120
for (i = region -> lb ; i < region -> pg_cnt / 32 ; i ++ ) {
122
- if (region -> freemap [i ])
121
+ if (~ region -> allocmap [i ])
123
122
break ;
124
123
}
125
124
if (i == region -> pg_cnt / 32 ) {
@@ -139,15 +138,15 @@ NOINLINE void *jl_gc_alloc_page(void)
139
138
region -> ub = i ;
140
139
141
140
#if defined(_COMPILER_MINGW_ )
142
- int j = __builtin_ffs (region -> freemap [i ]) - 1 ;
141
+ int j = __builtin_ffs (~ region -> allocmap [i ]) - 1 ;
143
142
#elif defined(_COMPILER_MICROSOFT_ )
144
143
unsigned long j ;
145
- _BitScanForward (& j , region -> freemap [i ]);
144
+ _BitScanForward (& j , ~ region -> allocmap [i ]);
146
145
#else
147
- int j = ffs (region -> freemap [i ]) - 1 ;
146
+ int j = ffs (~ region -> allocmap [i ]) - 1 ;
148
147
#endif
149
148
150
- region -> freemap [i ] &= ~ (uint32_t )(1 << j );
149
+ region -> allocmap [i ] |= (uint32_t )(1 << j );
151
150
void * ptr = region -> pages [i * 32 + j ].data ;
152
151
#ifdef _OS_WINDOWS_
153
152
VirtualAlloc (ptr , GC_PAGE_SZ , MEM_COMMIT , PAGE_READWRITE );
@@ -174,8 +173,8 @@ void jl_gc_free_page(void *p)
174
173
}
175
174
assert (i < REGION_COUNT && region -> pages != NULL );
176
175
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 ;
179
178
free (region -> meta [pg_idx ].ages );
180
179
// tell the OS we don't need these pages right now
181
180
size_t decommit_size = GC_PAGE_SZ ;
@@ -185,10 +184,13 @@ void jl_gc_free_page(void *p)
185
184
decommit_size = jl_page_size ;
186
185
p = (void * )((uintptr_t )region -> pages [pg_idx ].data & ~(jl_page_size - 1 )); // round down to the nearest page
187
186
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 ;
189
189
for (; n_pages -- ; pg_idx ++ ) {
190
190
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
+ }
192
194
}
193
195
}
194
196
#ifdef _OS_WINDOWS_
0 commit comments