aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/vespa/vespalib/util/monitored_refcount.h
diff options
context:
space:
mode:
Diffstat (limited to 'vespalib/src/vespa/vespalib/util/monitored_refcount.h')
-rw-r--r--vespalib/src/vespa/vespalib/util/monitored_refcount.h29
1 files changed, 29 insertions, 0 deletions
diff --git a/vespalib/src/vespa/vespalib/util/monitored_refcount.h b/vespalib/src/vespa/vespalib/util/monitored_refcount.h
new file mode 100644
index 00000000000..465284b6fd3
--- /dev/null
+++ b/vespalib/src/vespa/vespalib/util/monitored_refcount.h
@@ -0,0 +1,29 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#pragma once
+
+#include <mutex>
+#include <condition_variable>
+
+namespace vespalib {
+
+class RetainGuard;
+/*
+ * Class containing a reference count that can be waited on to become zero.
+ * Typically ancestor or member of a class that has to be careful of when
+ * portions object can be properly torn down before destruction itself.
+ */
+class MonitoredRefCount
+{
+ std::mutex _lock;
+ std::condition_variable _cv;
+ uint32_t _refCount;
+ void retain() noexcept;
+ void release() noexcept;
+ friend RetainGuard;
+public:
+ MonitoredRefCount();
+ virtual ~MonitoredRefCount();
+ void waitForZeroRefCount();
+};
+
+}