aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libutil/finally.hh9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/libutil/finally.hh b/src/libutil/finally.hh
index db654301f..49263ee6d 100644
--- a/src/libutil/finally.hh
+++ b/src/libutil/finally.hh
@@ -9,8 +9,15 @@ class Finally
{
private:
Fn fun;
+ bool movedFrom = false;
public:
Finally(Fn fun) : fun(std::move(fun)) { }
- ~Finally() { fun(); }
+ // Copying Finallys is definitely not a good idea and will cause them to be
+ // called twice.
+ Finally(Finally &other) = delete;
+ Finally(Finally &&other) : fun(std::move(other.fun)) {
+ other.movedFrom = true;
+ }
+ ~Finally() { if (!movedFrom) fun(); }
};