aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/remote-store-connection.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/remote-store-connection.hh')
-rw-r--r--src/libstore/remote-store-connection.hh31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/libstore/remote-store-connection.hh b/src/libstore/remote-store-connection.hh
index d32d91a60..ce4740a9c 100644
--- a/src/libstore/remote-store-connection.hh
+++ b/src/libstore/remote-store-connection.hh
@@ -1,5 +1,6 @@
#include "remote-store.hh"
#include "worker-protocol.hh"
+#include "pool.hh"
namespace nix {
@@ -94,4 +95,34 @@ struct RemoteStore::Connection
std::exception_ptr processStderr(Sink * sink = 0, Source * source = 0, bool flush = true);
};
+/**
+ * A wrapper around Pool<RemoteStore::Connection>::Handle that marks
+ * the connection as bad (causing it to be closed) if a non-daemon
+ * exception is thrown before the handle is closed. Such an exception
+ * causes a deviation from the expected protocol and therefore a
+ * desynchronization between the client and daemon.
+ */
+struct RemoteStore::ConnectionHandle
+{
+ Pool<RemoteStore::Connection>::Handle handle;
+ bool daemonException = false;
+
+ ConnectionHandle(Pool<RemoteStore::Connection>::Handle && handle)
+ : handle(std::move(handle))
+ { }
+
+ ConnectionHandle(ConnectionHandle && h)
+ : handle(std::move(h.handle))
+ { }
+
+ ~ConnectionHandle();
+
+ RemoteStore::Connection & operator * () { return *handle; }
+ RemoteStore::Connection * operator -> () { return &*handle; }
+
+ void processStderr(Sink * sink = 0, Source * source = 0, bool flush = true);
+
+ void withFramedSink(std::function<void(Sink & sink)> fun);
+};
+
}