about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2019-01-03 18:14:01 +0100
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>2019-01-03 18:14:01 +0100
commit75b2e143f125d7e214b8d3e54b3079caba1cc065 (patch)
tree28d56df8c5fe4e03dd821ef580e9e45650dc515a
parent140936307e692c324815c9640696b3e3f0c7ae78 (diff)
downloadrust-75b2e143f125d7e214b8d3e54b3079caba1cc065.tar.gz
rust-75b2e143f125d7e214b8d3e54b3079caba1cc065.zip
Make CompileController thread-safe
-rw-r--r--src/librustc_data_structures/sync.rs1
-rw-r--r--src/librustc_driver/driver.rs7
2 files changed, 5 insertions, 3 deletions
diff --git a/src/librustc_data_structures/sync.rs b/src/librustc_data_structures/sync.rs
index d935eb7bdab..c18a5328dd5 100644
--- a/src/librustc_data_structures/sync.rs
+++ b/src/librustc_data_structures/sync.rs
@@ -323,6 +323,7 @@ cfg_if! {
 }
 
 pub fn assert_sync<T: ?Sized + Sync>() {}
+pub fn assert_send<T: ?Sized + Send>() {}
 pub fn assert_send_val<T: ?Sized + Send>(_t: &T) {}
 pub fn assert_send_sync_val<T: ?Sized + Sync + Send>(_t: &T) {}
 
diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs
index 9b232edc11d..31e267ef3b6 100644
--- a/src/librustc_driver/driver.rs
+++ b/src/librustc_driver/driver.rs
@@ -403,14 +403,15 @@ pub struct CompileController<'a> {
 
     /// Allows overriding default rustc query providers,
     /// after `default_provide` has installed them.
-    pub provide: Box<dyn Fn(&mut ty::query::Providers) + 'a>,
+    pub provide: Box<dyn Fn(&mut ty::query::Providers) + 'a + sync::Send>,
     /// Same as `provide`, but only for non-local crates,
     /// applied after `default_provide_extern`.
-    pub provide_extern: Box<dyn Fn(&mut ty::query::Providers) + 'a>,
+    pub provide_extern: Box<dyn Fn(&mut ty::query::Providers) + 'a + sync::Send>,
 }
 
 impl<'a> CompileController<'a> {
     pub fn basic() -> CompileController<'a> {
+        sync::assert_send::<Self>();
         CompileController {
             after_parse: PhaseController::basic(),
             after_expand: PhaseController::basic(),
@@ -500,7 +501,7 @@ pub struct PhaseController<'a> {
     // If true then the compiler will try to run the callback even if the phase
     // ends with an error. Note that this is not always possible.
     pub run_callback_on_error: bool,
-    pub callback: Box<dyn Fn(&mut CompileState) + 'a>,
+    pub callback: Box<dyn Fn(&mut CompileState) + 'a + sync::Send>,
 }
 
 impl<'a> PhaseController<'a> {