about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMark Rousskov <mark.simulacrum@gmail.com>2019-11-10 11:48:47 -0500
committerMark Rousskov <mark.simulacrum@gmail.com>2019-11-10 11:48:47 -0500
commit2c34f384d4d2289e9c83000c01e8a4f98486e8ec (patch)
treeaf7679c9ac58914c94e7c4edd221e3da9e3f49c9
parent86c28325ff813e5cf4d0cab320a7c9f6fb0766b8 (diff)
downloadrust-2c34f384d4d2289e9c83000c01e8a4f98486e8ec.tar.gz
rust-2c34f384d4d2289e9c83000c01e8a4f98486e8ec.zip
Move lock into CodeStats
Prevent accidental too-long borrows by ensuring only encapsulated
locking.
-rw-r--r--src/librustc/session/code_stats.rs12
-rw-r--r--src/librustc/session/mod.rs2
-rw-r--r--src/librustc/ty/layout.rs14
-rw-r--r--src/librustc_driver/lib.rs2
4 files changed, 16 insertions, 14 deletions
diff --git a/src/librustc/session/code_stats.rs b/src/librustc/session/code_stats.rs
index 0f535249b5e..5baf0c5948f 100644
--- a/src/librustc/session/code_stats.rs
+++ b/src/librustc/session/code_stats.rs
@@ -1,6 +1,7 @@
 use rustc_target::abi::{Align, Size};
 use rustc_data_structures::fx::{FxHashSet};
 use std::cmp::{self, Ordering};
+use rustc_data_structures::sync::Lock;
 
 #[derive(Clone, PartialEq, Eq, Hash, Debug)]
 pub struct VariantInfo {
@@ -44,13 +45,13 @@ pub struct TypeSizeInfo {
     pub variants: Vec<VariantInfo>,
 }
 
-#[derive(PartialEq, Eq, Debug, Default)]
+#[derive(Default)]
 pub struct CodeStats {
-    type_sizes: FxHashSet<TypeSizeInfo>,
+    type_sizes: Lock<FxHashSet<TypeSizeInfo>>,
 }
 
 impl CodeStats {
-    pub fn record_type_size<S: ToString>(&mut self,
+    pub fn record_type_size<S: ToString>(&self,
                                          kind: DataTypeKind,
                                          type_desc: S,
                                          align: Align,
@@ -73,11 +74,12 @@ impl CodeStats {
             opt_discr_size: opt_discr_size.map(|s| s.bytes()),
             variants,
         };
-        self.type_sizes.insert(info);
+        self.type_sizes.borrow_mut().insert(info);
     }
 
     pub fn print_type_sizes(&self) {
-        let mut sorted: Vec<_> = self.type_sizes.iter().collect();
+        let type_sizes = self.type_sizes.borrow();
+        let mut sorted: Vec<_> = type_sizes.iter().collect();
 
         // Primary sort: large-to-small.
         // Secondary sort: description (dictionary order)
diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs
index bab7ab89ce7..920438da0d6 100644
--- a/src/librustc/session/mod.rs
+++ b/src/librustc/session/mod.rs
@@ -124,7 +124,7 @@ pub struct Session {
     pub perf_stats: PerfStats,
 
     /// Data about code being compiled, gathered during compilation.
-    pub code_stats: Lock<CodeStats>,
+    pub code_stats: CodeStats,
 
     /// If `-zfuel=crate=n` is specified, `Some(crate)`.
     optimization_fuel_crate: Option<String>,
diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs
index 4bf500555f1..56fa2d6e89d 100644
--- a/src/librustc/ty/layout.rs
+++ b/src/librustc/ty/layout.rs
@@ -1614,13 +1614,13 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
         // (delay format until we actually need it)
         let record = |kind, packed, opt_discr_size, variants| {
             let type_desc = format!("{:?}", layout.ty);
-            self.tcx.sess.code_stats.borrow_mut().record_type_size(kind,
-                                                                   type_desc,
-                                                                   layout.align.abi,
-                                                                   layout.size,
-                                                                   packed,
-                                                                   opt_discr_size,
-                                                                   variants);
+            self.tcx.sess.code_stats.record_type_size(kind,
+                                                      type_desc,
+                                                      layout.align.abi,
+                                                      layout.size,
+                                                      packed,
+                                                      opt_discr_size,
+                                                      variants);
         };
 
         let adt_def = match layout.ty.kind {
diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs
index 7973a804f1a..294019496e1 100644
--- a/src/librustc_driver/lib.rs
+++ b/src/librustc_driver/lib.rs
@@ -394,7 +394,7 @@ pub fn run_compiler(
         mem::drop(compiler.global_ctxt()?.take());
 
         if sess.opts.debugging_opts.print_type_sizes {
-            sess.code_stats.borrow().print_type_sizes();
+            sess.code_stats.print_type_sizes();
         }
 
         compiler.link()?;