From b52e71191094f564d7b7484b89e47e710bb94bdc Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 2 May 2006 17:12:03 +0000 Subject: [PATCH] * Huge reduction in memory use (2/3 or so on large nix-env -qas operations): share ATermMaps between DrvInfos. --- src/libexpr/get-drvs.cc | 16 ++++++++-------- src/libexpr/get-drvs.hh | 4 +++- 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 bc2302a0b2..78ccab7f32 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 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 e692a5c660..2b88111b2c 100644 --- a/src/libexpr/get-drvs.hh +++ b/src/libexpr/get-drvs.hh @@ -4,6 +4,8 @@ #include #include +#include + #include "eval.hh" @@ -20,7 +22,7 @@ public: string name; string system; - ATermMap attrs; + shared_ptr 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 f9a0c19a9b..ad3c1b5ce3 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(new ATermMap()); /* ugh... */ string name = baseNameOf(*i); unsigned int dash = name.find('-'); if (dash != string::npos)