Skip to content

Commit 1febdb2

Browse files
committed
parallelize sweeping of object pools
1 parent 8bc6c35 commit 1febdb2

File tree

8 files changed

+185
-102
lines changed

8 files changed

+185
-102
lines changed

src/gc-debug.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ static void gc_clear_mark_outer(int bits)
115115
{
116116
for (int i = 0; i < gc_n_threads; i++) {
117117
jl_ptls_t ptls2 = gc_all_tls_states[i];
118-
jl_gc_pagemeta_t *pg = ptls2->page_metadata_allocd;
118+
jl_gc_pagemeta_t *pg = jl_atomic_load_relaxed(&ptls2->page_metadata_allocd.bottom);
119119
while (pg != NULL) {
120120
gc_clear_mark_page(pg, bits);
121121
pg = pg->next;
@@ -1153,7 +1153,7 @@ static void gc_count_pool_pagetable(void)
11531153
{
11541154
for (int i = 0; i < gc_n_threads; i++) {
11551155
jl_ptls_t ptls2 = gc_all_tls_states[i];
1156-
jl_gc_pagemeta_t *pg = ptls2->page_metadata_allocd;
1156+
jl_gc_pagemeta_t *pg = jl_atomic_load_relaxed(&ptls2->page_metadata_allocd.bottom);
11571157
while (pg != NULL) {
11581158
if (gc_alloc_map_is_set(pg->data)) {
11591159
gc_count_pool_page(pg);

src/gc-pages.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,22 +100,22 @@ NOINLINE jl_gc_pagemeta_t *jl_gc_alloc_page(void) JL_NOTSAFEPOINT
100100
jl_gc_pagemeta_t *meta = NULL;
101101

102102
// try to get page from `pool_lazily_freed`
103-
meta = pop_lf_page_metadata_back(&global_page_pool_lazily_freed);
103+
meta = pop_lf_back(&global_page_pool_lazily_freed);
104104
if (meta != NULL) {
105105
gc_alloc_map_set(meta->data, GC_PAGE_ALLOCATED);
106106
// page is already mapped
107107
return meta;
108108
}
109109

110110
// try to get page from `pool_clean`
111-
meta = pop_lf_page_metadata_back(&global_page_pool_clean);
111+
meta = pop_lf_back(&global_page_pool_clean);
112112
if (meta != NULL) {
113113
gc_alloc_map_set(meta->data, GC_PAGE_ALLOCATED);
114114
goto exit;
115115
}
116116

117117
// try to get page from `pool_freed`
118-
meta = pop_lf_page_metadata_back(&global_page_pool_freed);
118+
meta = pop_lf_back(&global_page_pool_freed);
119119
if (meta != NULL) {
120120
jl_atomic_fetch_add_relaxed(&gc_heap_stats.bytes_resident, GC_PAGE_SZ);
121121
gc_alloc_map_set(meta->data, GC_PAGE_ALLOCATED);
@@ -124,7 +124,7 @@ NOINLINE jl_gc_pagemeta_t *jl_gc_alloc_page(void) JL_NOTSAFEPOINT
124124

125125
uv_mutex_lock(&gc_perm_lock);
126126
// another thread may have allocated a large block while we were waiting...
127-
meta = pop_lf_page_metadata_back(&global_page_pool_clean);
127+
meta = pop_lf_back(&global_page_pool_clean);
128128
if (meta != NULL) {
129129
uv_mutex_unlock(&gc_perm_lock);
130130
gc_alloc_map_set(meta->data, GC_PAGE_ALLOCATED);
@@ -138,10 +138,10 @@ NOINLINE jl_gc_pagemeta_t *jl_gc_alloc_page(void) JL_NOTSAFEPOINT
138138
pg->data = data + GC_PAGE_SZ * i;
139139
gc_alloc_map_maybe_create(pg->data);
140140
if (i == 0) {
141-
gc_alloc_map_set(pg->data, 1);
141+
gc_alloc_map_set(pg->data, GC_PAGE_ALLOCATED);
142142
}
143143
else {
144-
push_lf_page_metadata_back(&global_page_pool_clean, pg);
144+
push_lf_back(&global_page_pool_clean, pg);
145145
}
146146
}
147147
uv_mutex_unlock(&gc_perm_lock);

0 commit comments

Comments
 (0)