aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/build/worker.cc
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-09-25 23:57:46 +0200
committereldritch horrors <pennae@lix.systems>2024-09-29 14:29:14 +0000
commita5240b23abba2724073f79b79648bf4afb38f70a (patch)
treec3f9255cc1f4c0382fc8eec11a9a1363ff9ff014 /src/libstore/build/worker.cc
parent8fb642b6e09368d10d8357fcb7c508f706fa5f08 (diff)
libstore: make non-cache goal pointers strong
without circular references we do not need weak goal pointers except for caches, which should not prevent goal destructors running. caches though cannot create circular references even when they keep strong references. if we removed goals from caches when their work() is fully finished, not when their destructors are run, we could keep strong pointers in caches. since we do not gain much from this we keep those pointers weak for now. Change-Id: I1d4a6850ff5e264443c90eb4531da89f5e97a3a0
Diffstat (limited to 'src/libstore/build/worker.cc')
-rw-r--r--src/libstore/build/worker.cc8
1 files changed, 2 insertions, 6 deletions
diff --git a/src/libstore/build/worker.cc b/src/libstore/build/worker.cc
index 1b1bf1d5c..2894620a1 100644
--- a/src/libstore/build/worker.cc
+++ b/src/libstore/build/worker.cc
@@ -44,6 +44,7 @@ Worker::~Worker()
are in trouble, since goals may call childTerminated() etc. in
their destructors). */
topGoals.clear();
+ awake.clear();
children.clear();
assert(expectedSubstitutions == 0);
@@ -310,12 +311,7 @@ std::vector<GoalPtr> Worker::run(std::function<Targets (GoalFactory &)> req)
/* Call every wake goal (in the ordering established by
CompareGoalPtrs). */
while (!awake.empty() && !topGoals.empty()) {
- Goals awake2;
- for (auto & i : awake) {
- GoalPtr goal = i.lock();
- if (goal) awake2.insert(goal);
- }
- awake.clear();
+ Goals awake2 = std::move(awake);
for (auto & goal : awake2) {
checkInterrupt();
auto result = goal->work();