From 351d9821b4d57b86f9dade0d8cd7b47c07edbb4e Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Thu, 21 Mar 2024 13:16:49 +0800 Subject: [PATCH] Align GCWorkers with GCWorkerShared The index of `worker_group.workers_shared` should represent the ordinal --- src/scheduler/worker.rs | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/scheduler/worker.rs b/src/scheduler/worker.rs index bb3dd83c36..1a7c7b4a7f 100644 --- a/src/scheduler/worker.rs +++ b/src/scheduler/worker.rs @@ -282,23 +282,21 @@ unsafe impl Sync for WorkerGroup {} impl WorkerGroup { /// Create a WorkerGroup pub fn new(num_workers: usize) -> Arc { - let unspawned_local_work_queues = (0..num_workers) + let local_work_queues = (0..num_workers) .map(|_| deque::Worker::new_fifo()) .collect::>(); let workers_shared = (0..num_workers) .map(|i| { Arc::new(GCWorkerShared::::new(Some( - unspawned_local_work_queues[i].stealer(), + local_work_queues[i].stealer(), ))) }) .collect::>(); Arc::new(Self { workers_shared, - state: Mutex::new(WorkerCreationState::NotCreated { - local_work_queues: unspawned_local_work_queues, - }), + state: Mutex::new(WorkerCreationState::NotCreated { local_work_queues }), }) } @@ -312,19 +310,21 @@ impl WorkerGroup { }; assert_eq!(self.workers_shared.len(), local_work_queues.len()); - let mut workers = Vec::with_capacity(self.workers_shared.len()); // Spawn each worker thread. - for (ordinal, shared) in self.workers_shared.iter().enumerate() { - let worker = Box::new(GCWorker::new( - mmtk, - ordinal, - mmtk.scheduler.clone(), - shared.clone(), - local_work_queues.pop().unwrap(), - )); - workers.push(worker); - } + let workers = (local_work_queues.drain(..)) + .zip(self.workers_shared.iter()) + .enumerate() + .map(|(ordinal, (queue, shared))| { + Box::new(GCWorker::new( + mmtk, + ordinal, + mmtk.scheduler.clone(), + shared.clone(), + queue, + )) + }) + .collect::>(); *state = WorkerCreationState::Resting { workers }; debug!("GCWorker instances created.");