* Huge reduction in memory use (2/3 or so on large nix-env -qas

operations): share ATermMaps between DrvInfos.
This commit is contained in:
Eelco Dolstra 2006-05-02 17:12:03 +00:00
parent 11ae2d1e7a
commit b52e711910
3 changed files with 12 additions and 9 deletions

View File

@ -5,7 +5,7 @@
string DrvInfo::queryDrvPath(EvalState & state) const string DrvInfo::queryDrvPath(EvalState & state) const
{ {
if (drvPath == "") { if (drvPath == "") {
Expr a = attrs.get("drvPath"); Expr a = attrs->get("drvPath");
(string &) drvPath = a ? evalPath(state, a) : ""; (string &) drvPath = a ? evalPath(state, a) : "";
} }
return drvPath; return drvPath;
@ -15,7 +15,7 @@ string DrvInfo::queryDrvPath(EvalState & state) const
string DrvInfo::queryOutPath(EvalState & state) const string DrvInfo::queryOutPath(EvalState & state) const
{ {
if (outPath == "") { if (outPath == "") {
Expr a = attrs.get("outPath"); Expr a = attrs->get("outPath");
if (!a) throw Error("output path missing"); if (!a) throw Error("output path missing");
(string &) outPath = evalPath(state, a); (string &) outPath = evalPath(state, a);
} }
@ -27,7 +27,7 @@ MetaInfo DrvInfo::queryMetaInfo(EvalState & state) const
{ {
MetaInfo meta; MetaInfo meta;
Expr a = attrs.get("meta"); Expr a = attrs->get("meta");
if (!a) return meta; /* fine, empty meta information */ if (!a) return meta; /* fine, empty meta information */
ATermMap attrs2; ATermMap attrs2;
@ -66,10 +66,10 @@ static bool getDerivation(EvalState & state, Expr e,
e = evalExpr(state, e); e = evalExpr(state, e);
if (!matchAttrs(e, es)) return true; if (!matchAttrs(e, es)) return true;
ATermMap attrs; shared_ptr<ATermMap> attrs(new ATermMap());
queryAllAttrs(e, attrs, false); queryAllAttrs(e, *attrs, false);
Expr a = attrs.get("type"); Expr a = attrs->get("type");
if (!a || evalString(state, a) != "derivation") return true; if (!a || evalString(state, a) != "derivation") return true;
/* Remove spurious duplicates (e.g., an attribute set like /* Remove spurious duplicates (e.g., an attribute set like
@ -79,11 +79,11 @@ static bool getDerivation(EvalState & state, Expr e,
DrvInfo drv; DrvInfo drv;
a = attrs.get("name"); a = attrs->get("name");
if (!a) throw badTerm("derivation name missing", e); if (!a) throw badTerm("derivation name missing", e);
drv.name = evalString(state, a); drv.name = evalString(state, a);
a = attrs.get("system"); a = attrs->get("system");
if (!a) if (!a)
drv.system = "unknown"; drv.system = "unknown";
else else

View File

@ -4,6 +4,8 @@
#include <string> #include <string>
#include <map> #include <map>
#include <boost/shared_ptr.hpp>
#include "eval.hh" #include "eval.hh"
@ -20,7 +22,7 @@ public:
string name; string name;
string system; string system;
ATermMap attrs; shared_ptr<ATermMap> attrs;
string queryDrvPath(EvalState & state) const; string queryDrvPath(EvalState & state) const;
string queryOutPath(EvalState & state) const; string queryOutPath(EvalState & state) const;

View File

@ -348,6 +348,7 @@ static void queryInstSources(EvalState & state,
assertStorePath(*i); assertStorePath(*i);
DrvInfo elem; DrvInfo elem;
elem.attrs = shared_ptr<ATermMap>(new ATermMap()); /* ugh... */
string name = baseNameOf(*i); string name = baseNameOf(*i);
unsigned int dash = name.find('-'); unsigned int dash = name.find('-');
if (dash != string::npos) if (dash != string::npos)