From 736c3d7bb79fb0b29c479e3191e5cad27f9872fb Mon Sep 17 00:00:00 2001 From: Eh2406 Date: Thu, 5 Apr 2018 16:34:49 -0400 Subject: [PATCH 1/2] use more Rc in the part of resolver that gets cloned a lot --- src/cargo/core/resolver/context.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cargo/core/resolver/context.rs b/src/cargo/core/resolver/context.rs index b2b49a6b5a2..f132463e3c8 100644 --- a/src/cargo/core/resolver/context.rs +++ b/src/cargo/core/resolver/context.rs @@ -23,7 +23,7 @@ pub struct Context { // switch to persistent hash maps if we can at some point or otherwise // make these much cheaper to clone in general. pub activations: Activations, - pub resolve_features: HashMap>, + pub resolve_features: HashMap>>, pub links: HashMap, // These are two cheaply-cloneable lists (O(1) clone) which are effectively @@ -36,6 +36,8 @@ pub struct Context { pub warnings: RcList, } +pub type Activations = HashMap<(InternedString, SourceId), Rc>>; + impl Context { pub fn new() -> Context { Context { @@ -246,10 +248,13 @@ impl Context { let set = self.resolve_features .entry(pkgid.clone()) - .or_insert_with(HashSet::new); + .or_insert_with(|| Rc::new(HashSet::new())); + + let mut inner: HashSet<_> = (**set).clone(); for feature in reqs.used { - set.insert(InternedString::new(feature)); + inner.insert(InternedString::new(feature)); } + *set = Rc::new(inner); } Ok(ret) @@ -405,5 +410,3 @@ impl<'r> Requirements<'r> { } } } - -pub type Activations = HashMap<(InternedString, SourceId), Rc>>; From 04fbc5f6e8d4b2ff5de1fb3d58dbccda9fcc8aff Mon Sep 17 00:00:00 2001 From: Eh2406 Date: Fri, 6 Apr 2018 12:38:41 -0400 Subject: [PATCH 2/2] use make_mut for cleaner code --- src/cargo/core/resolver/context.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/cargo/core/resolver/context.rs b/src/cargo/core/resolver/context.rs index f132463e3c8..2c2281d6107 100644 --- a/src/cargo/core/resolver/context.rs +++ b/src/cargo/core/resolver/context.rs @@ -68,9 +68,7 @@ impl Context { &*link ); } - let mut inner: Vec<_> = (**prev).clone(); - inner.push(summary.clone()); - *prev = Rc::new(inner); + Rc::make_mut(prev).push(summary.clone()); return Ok(false); } debug!("checking if {} is already activated", summary.package_id()); @@ -246,15 +244,13 @@ impl Context { if !reqs.used.is_empty() { let pkgid = s.package_id(); - let set = self.resolve_features + let set = Rc::make_mut(self.resolve_features .entry(pkgid.clone()) - .or_insert_with(|| Rc::new(HashSet::new())); + .or_insert_with(|| Rc::new(HashSet::new()))); - let mut inner: HashSet<_> = (**set).clone(); for feature in reqs.used { - inner.insert(InternedString::new(feature)); + set.insert(InternedString::new(feature)); } - *set = Rc::new(inner); } Ok(ret)