about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Woerister <michaelwoerister@posteo.net>2017-07-27 11:51:27 +0200
committerMichael Woerister <michaelwoerister@posteo.net>2017-07-31 15:15:09 +0200
commit1480be37795bd25b7d7cedf9e1ef5caf985fe38c (patch)
treeedc2fb0c0e352f2def594260dc3c728dc4e44f8a
parentab3bc584c0412e31efd7b92ef77b7cebfa555926 (diff)
downloadrust-1480be37795bd25b7d7cedf9e1ef5caf985fe38c.tar.gz
rust-1480be37795bd25b7d7cedf9e1ef5caf985fe38c.zip
async-llvm(21): Re-use worker-ids in order to simulate persistent worker threads.
-rw-r--r--src/librustc_trans/back/write.rs35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/librustc_trans/back/write.rs b/src/librustc_trans/back/write.rs
index f792da01cde..086980777e1 100644
--- a/src/librustc_trans/back/write.rs
+++ b/src/librustc_trans/back/write.rs
@@ -1063,7 +1063,10 @@ fn execute_work_item(cgcx: &CodegenContext, work_item: WorkItem)
 #[derive(Debug)]
 enum Message {
     Token(io::Result<Acquired>),
-    Done { result: Result<CompiledModule, ()> },
+    Done {
+        result: Result<CompiledModule, ()>,
+        worker_id: usize,
+    },
     WorkItem(WorkItem),
     CheckErrorMessages,
     TranslationDone,
@@ -1179,6 +1182,18 @@ fn start_executing_work(sess: &Session,
     // the jobserver.
 
     thread::spawn(move || {
+        let mut worker_id_counter = 0;
+        let mut free_worker_ids = Vec::new();
+        let mut get_worker_id = |free_worker_ids: &mut Vec<usize>| {
+            if let Some(id) = free_worker_ids.pop() {
+                id
+            } else {
+                let id = worker_id_counter;
+                worker_id_counter += 1;
+                id
+            }
+        };
+
         let mut compiled_modules = vec![];
         let mut compiled_metadata_module = None;
         let mut compiled_allocator_module = None;
@@ -1186,17 +1201,19 @@ fn start_executing_work(sess: &Session,
         let mut translation_done = false;
         let mut work_items = Vec::new();
         let mut tokens = Vec::new();
+
         let mut running = 0;
+
         while !translation_done || work_items.len() > 0 || running > 0 {
 
             // Spin up what work we can, only doing this while we've got available
             // parallelism slots and work left to spawn.
             while work_items.len() > 0 && running < tokens.len() + 1 {
                 let item = work_items.pop().unwrap();
-                let worker_index = work_items.len();
+                let worker_id = get_worker_id(&mut free_worker_ids);
 
                 let cgcx = CodegenContext {
-                    worker: worker_index,
+                    worker: worker_id,
                     .. cgcx.clone()
                 };
 
@@ -1235,9 +1252,10 @@ fn start_executing_work(sess: &Session,
                 //
                 // Note that if the thread failed that means it panicked, so we
                 // abort immediately.
-                Message::Done { result: Ok(compiled_module) } => {
+                Message::Done { result: Ok(compiled_module), worker_id } => {
                     drop(tokens.pop());
                     running -= 1;
+                    free_worker_ids.push(worker_id);
                     drop(trans_worker_send.send(Message::CheckErrorMessages));
 
                     match compiled_module.kind {
@@ -1254,7 +1272,7 @@ fn start_executing_work(sess: &Session,
                         }
                     }
                 }
-                Message::Done { result: Err(()) } => {
+                Message::Done { result: Err(()), worker_id: _ } => {
                     shared_emitter.fatal("aborting due to worker thread panic");
                     drop(trans_worker_send.send(Message::CheckErrorMessages));
                     // Exit the coordinator thread
@@ -1288,6 +1306,7 @@ fn spawn_work(cgcx: CodegenContext, work: WorkItem) {
         struct Bomb {
             coordinator_send: Sender<Message>,
             result: Option<CompiledModule>,
+            worker_id: usize,
         }
         impl Drop for Bomb {
             fn drop(&mut self) {
@@ -1296,13 +1315,17 @@ fn spawn_work(cgcx: CodegenContext, work: WorkItem) {
                     None => Err(())
                 };
 
-                drop(self.coordinator_send.send(Message::Done { result }));
+                drop(self.coordinator_send.send(Message::Done {
+                    result,
+                    worker_id: self.worker_id,
+                }));
             }
         }
 
         let mut bomb = Bomb {
             coordinator_send: cgcx.coordinator_send.clone(),
             result: None,
+            worker_id: cgcx.worker,
         };
 
         // Execute the work itself, and if it finishes successfully then flag