Skip to content

Commit 8490f73

Browse files
committed
backport parallel sweeping of object pools
1 parent 426927e commit 8490f73

File tree

6 files changed

+178
-82
lines changed

6 files changed

+178
-82
lines changed

src/gc-debug.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ static void gc_clear_mark_outer(int bits)
112112
{
113113
for (int i = 0; i < gc_n_threads; i++) {
114114
jl_ptls_t ptls2 = gc_all_tls_states[i];
115-
jl_gc_pagemeta_t *pg = ptls2->page_metadata_allocd;
115+
jl_gc_pagemeta_t *pg = jl_atomic_load_relaxed(&ptls2->page_metadata_allocd.bottom);
116116
while (pg != NULL) {
117117
gc_clear_mark_page(pg, bits);
118118
pg = pg->next;
@@ -1157,7 +1157,7 @@ static void gc_count_pool_pagetable(void)
11571157
{
11581158
for (int i = 0; i < gc_n_threads; i++) {
11591159
jl_ptls_t ptls2 = gc_all_tls_states[i];
1160-
jl_gc_pagemeta_t *pg = ptls2->page_metadata_allocd;
1160+
jl_gc_pagemeta_t *pg = jl_atomic_load_relaxed(&ptls2->page_metadata_allocd.bottom);
11611161
while (pg != NULL) {
11621162
if (gc_alloc_map_is_set(pg->data)) {
11631163
gc_count_pool_page(pg);

src/gc-pages.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,22 +129,22 @@ NOINLINE jl_gc_pagemeta_t *jl_gc_alloc_page(void) JL_NOTSAFEPOINT
129129
jl_gc_pagemeta_t *meta = NULL;
130130

131131
// try to get page from `pool_clean`
132-
meta = pop_lf_page_metadata_back(&global_page_pool_clean);
132+
meta = pop_lf_back(&global_page_pool_clean);
133133
if (meta != NULL) {
134134
gc_alloc_map_set(meta->data, GC_PAGE_ALLOCATED);
135135
goto exit;
136136
}
137137

138138
// try to get page from `pool_freed`
139-
meta = pop_lf_page_metadata_back(&global_page_pool_freed);
139+
meta = pop_lf_back(&global_page_pool_freed);
140140
if (meta != NULL) {
141141
gc_alloc_map_set(meta->data, GC_PAGE_ALLOCATED);
142142
goto exit;
143143
}
144144

145145
uv_mutex_lock(&gc_perm_lock);
146-
// another thread may have allocated a large block while we're waiting...
147-
meta = pop_lf_page_metadata_back(&global_page_pool_clean);
146+
// another thread may have allocated a large block while we were waiting...
147+
meta = pop_lf_back(&global_page_pool_clean);
148148
if (meta != NULL) {
149149
uv_mutex_unlock(&gc_perm_lock);
150150
gc_alloc_map_set(meta->data, GC_PAGE_ALLOCATED);
@@ -161,7 +161,7 @@ NOINLINE jl_gc_pagemeta_t *jl_gc_alloc_page(void) JL_NOTSAFEPOINT
161161
gc_alloc_map_set(pg->data, GC_PAGE_ALLOCATED);
162162
}
163163
else {
164-
push_lf_page_metadata_back(&global_page_pool_clean, pg);
164+
push_lf_back(&global_page_pool_clean, pg);
165165
}
166166
}
167167
uv_mutex_unlock(&gc_perm_lock);

0 commit comments

Comments
 (0)