diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-05-02T17·12+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2006-05-02T17·12+0000 |
commit | b52e71191094f564d7b7484b89e47e710bb94bdc (patch) | |
tree | aa36002c9e96b31e258e82c903b08a6db03410b0 /src | |
parent | 11ae2d1e7af05c3410a368338c7d13a49c2d2ccd (diff) |
* Huge reduction in memory use (2/3 or so on large nix-env -qas
operations): share ATermMaps between DrvInfos.
Diffstat (limited to 'src')
-rw-r--r-- | src/libexpr/get-drvs.cc | 16 | ||||
-rw-r--r-- | src/libexpr/get-drvs.hh | 4 | ||||
-rw-r--r-- | src/nix-env/main.cc | 1 |
3 files changed, 12 insertions, 9 deletions
diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc index bc2302a0b2fb..78ccab7f32a7 100644 --- a/src/libexpr/get-drvs.cc +++ b/src/libexpr/get-drvs.cc @@ -5,7 +5,7 @@ string DrvInfo::queryDrvPath(EvalState & state) const { if (drvPath == "") { - Expr a = attrs.get("drvPath"); + Expr a = attrs->get("drvPath"); (string &) drvPath = a ? evalPath(state, a) : ""; } return drvPath; @@ -15,7 +15,7 @@ string DrvInfo::queryDrvPath(EvalState & state) const string DrvInfo::queryOutPath(EvalState & state) const { if (outPath == "") { - Expr a = attrs.get("outPath"); + Expr a = attrs->get("outPath"); if (!a) throw Error("output path missing"); (string &) outPath = evalPath(state, a); } @@ -27,7 +27,7 @@ MetaInfo DrvInfo::queryMetaInfo(EvalState & state) const { MetaInfo meta; - Expr a = attrs.get("meta"); + Expr a = attrs->get("meta"); if (!a) return meta; /* fine, empty meta information */ ATermMap attrs2; @@ -66,10 +66,10 @@ static bool getDerivation(EvalState & state, Expr e, e = evalExpr(state, e); if (!matchAttrs(e, es)) return true; - ATermMap attrs; - queryAllAttrs(e, attrs, false); + shared_ptr<ATermMap> attrs(new ATermMap()); + queryAllAttrs(e, *attrs, false); - Expr a = attrs.get("type"); + Expr a = attrs->get("type"); if (!a || evalString(state, a) != "derivation") return true; /* Remove spurious duplicates (e.g., an attribute set like @@ -79,11 +79,11 @@ static bool getDerivation(EvalState & state, Expr e, DrvInfo drv; - a = attrs.get("name"); + a = attrs->get("name"); if (!a) throw badTerm("derivation name missing", e); drv.name = evalString(state, a); - a = attrs.get("system"); + a = attrs->get("system"); if (!a) drv.system = "unknown"; else diff --git a/src/libexpr/get-drvs.hh b/src/libexpr/get-drvs.hh index e692a5c660e1..2b88111b2c84 100644 --- a/src/libexpr/get-drvs.hh +++ b/src/libexpr/get-drvs.hh @@ -4,6 +4,8 @@ #include <string> #include <map> +#include <boost/shared_ptr.hpp> + #include "eval.hh" @@ -20,7 +22,7 @@ public: string name; string system; - ATermMap attrs; + shared_ptr<ATermMap> attrs; string queryDrvPath(EvalState & state) const; string queryOutPath(EvalState & state) const; diff --git a/src/nix-env/main.cc b/src/nix-env/main.cc index f9a0c19a9b63..ad3c1b5ce329 100644 --- a/src/nix-env/main.cc +++ b/src/nix-env/main.cc @@ -348,6 +348,7 @@ static void queryInstSources(EvalState & state, assertStorePath(*i); DrvInfo elem; + elem.attrs = shared_ptr<ATermMap>(new ATermMap()); /* ugh... */ string name = baseNameOf(*i); unsigned int dash = name.find('-'); if (dash != string::npos) |