Skip to content

Commit 45dabe3

Browse files
eightbitraptormatzbot
authored andcommitted
[ruby/mmtk] Distribute batch candidates across parallel buckets
Instead of sending all 128 buffered objects to one bucket, round-robin distribute them across all worker buckets so parallel obj_free work stays balanced. ruby/mmtk@e1f926cd21
1 parent 3ec9baf commit 45dabe3

1 file changed

Lines changed: 11 additions & 13 deletions

File tree

gc/mmtk/src/weak_proc.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::sync::atomic::AtomicUsize;
2-
use std::sync::atomic::Ordering;
31
use std::sync::Mutex;
42

53
use mmtk::scheduler::GCWork;
@@ -15,7 +13,6 @@ use crate::Ruby;
1513
pub struct WeakProcessor {
1614
non_parallel_obj_free_candidates: Mutex<Vec<ObjectReference>>,
1715
parallel_obj_free_candidates: Vec<Mutex<Vec<ObjectReference>>>,
18-
parallel_obj_free_candidates_counter: AtomicUsize,
1916

2017
/// Objects that needs `obj_free` called when dying.
2118
/// If it is a bottleneck, replace it with a lock-free data structure,
@@ -34,7 +31,6 @@ impl WeakProcessor {
3431
Self {
3532
non_parallel_obj_free_candidates: Mutex::new(Vec::new()),
3633
parallel_obj_free_candidates: vec![Mutex::new(Vec::new())],
37-
parallel_obj_free_candidates_counter: AtomicUsize::new(0),
3834
weak_references: Mutex::new(Vec::new()),
3935
}
4036
}
@@ -62,15 +58,17 @@ impl WeakProcessor {
6258
}
6359

6460
if can_parallel_free {
65-
let idx = self
66-
.parallel_obj_free_candidates_counter
67-
.fetch_add(1, Ordering::Relaxed)
68-
% self.parallel_obj_free_candidates.len();
69-
70-
self.parallel_obj_free_candidates[idx]
71-
.lock()
72-
.unwrap()
73-
.extend_from_slice(objects);
61+
let num_buckets = self.parallel_obj_free_candidates.len();
62+
for idx in 0..num_buckets {
63+
let mut bucket = self.parallel_obj_free_candidates[idx]
64+
.lock()
65+
.unwrap();
66+
for (i, &obj) in objects.iter().enumerate() {
67+
if i % num_buckets == idx {
68+
bucket.push(obj);
69+
}
70+
}
71+
}
7472
} else {
7573
self.non_parallel_obj_free_candidates
7674
.lock()

0 commit comments

Comments
 (0)