aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-05-02 17:12:03 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-05-02 17:12:03 +0000
commitb52e71191094f564d7b7484b89e47e710bb94bdc (patch)
treeaa36002c9e96b31e258e82c903b08a6db03410b0 /src
parent11ae2d1e7af05c3410a368338c7d13a49c2d2ccd (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.cc16
-rw-r--r--src/libexpr/get-drvs.hh4
-rw-r--r--src/nix-env/main.cc1
3 files changed, 12 insertions, 9 deletions
diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc
index bc2302a0b..78ccab7f3 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 e692a5c66..2b88111b2 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 f9a0c19a9..ad3c1b5ce 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)