aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libstore/remote-store.cc1
-rw-r--r--src/libutil/pool.hh5
2 files changed, 5 insertions, 1 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 3188d9330..20c1c50f2 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -155,6 +155,7 @@ void RemoteStore::setOptions(Connection & conn)
RemoteStore::ConnectionHandle::~ConnectionHandle()
{
if (!daemonException && std::uncaught_exceptions()) {
+ handle.markBad();
debug("closing daemon connection because of an exception");
}
}
diff --git a/src/libutil/pool.hh b/src/libutil/pool.hh
index 2f6d30130..b7a749e3a 100644
--- a/src/libutil/pool.hh
+++ b/src/libutil/pool.hh
@@ -103,6 +103,7 @@ public:
private:
Pool & pool;
std::shared_ptr<R> r;
+ bool bad = false;
friend Pool;
@@ -118,7 +119,7 @@ public:
if (!r) return;
{
auto state_(pool.state.lock());
- if (!std::uncaught_exceptions())
+ if (!bad && !std::uncaught_exceptions())
state_->idle.push_back(ref<R>(r));
assert(state_->inUse);
state_->inUse--;
@@ -128,6 +129,8 @@ public:
R * operator -> () { return &*r; }
R & operator * () { return *r; }
+
+ void markBad() { bad = true; }
};
Handle get()