summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-04-18 17:39:10 -0700
committerSamuel Just <sam.just@inktank.com>2013-04-19 11:00:22 -0700
commit66c007fb3b71156a72e8bcfd8295a3e8f812d1bb (patch)
tree13c271e34d115b74f715e45a233f7acce5139be6
parentec6f71bd027036a3d3496625cf8dfcd9121bc828 (diff)
downloadceph-66c007fb3b71156a72e8bcfd8295a3e8f812d1bb.tar.gz
common/: add tracked_int_ptr.hpp
TrackedIntPtr acts like intrusive_ptr, but is able to track a ref id. Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r--src/Makefile.am1
-rw-r--r--src/common/tracked_int_ptr.hpp67
2 files changed, 68 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index d528b78a1be..cd360fcd147 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1601,6 +1601,7 @@ noinst_HEADERS = \
common/admin_socket.h \
common/admin_socket_client.h \
common/shared_cache.hpp \
+ common/tracked_int_ptr.hpp \
common/simple_cache.hpp \
common/sharedptr_registry.hpp \
common/map_cacher.hpp \
diff --git a/src/common/tracked_int_ptr.hpp b/src/common/tracked_int_ptr.hpp
new file mode 100644
index 00000000000..ba0900db6bd
--- /dev/null
+++ b/src/common/tracked_int_ptr.hpp
@@ -0,0 +1,67 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2013 Inktank Storage, Inc.
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#ifndef CEPH_TRACKEDINTPTR_H
+#define CEPH_TRACKEDINTPTR_H
+
+#include <map>
+#include <list>
+#include <memory>
+#include <utility>
+#include "common/Mutex.h"
+#include "common/Cond.h"
+
+template <class T>
+class TrackedIntPtr {
+ T *ptr;
+ uint64_t id;
+public:
+ TrackedIntPtr() : ptr(NULL), id(0) {}
+ TrackedIntPtr(T *ptr) : ptr(ptr), id(ptr ? get_with_id(ptr) : 0) {}
+ ~TrackedIntPtr() {
+ if (ptr)
+ put_with_id(ptr, id);
+ else
+ assert(id == 0);
+ }
+ void swap(TrackedIntPtr &other) {
+ T *optr = other.ptr;
+ uint64_t oid = other.id;
+ other.ptr = ptr;
+ other.id = id;
+ ptr = optr;
+ id = oid;
+ }
+ TrackedIntPtr(const TrackedIntPtr &rhs) :
+ ptr(rhs.ptr), id(ptr ? get_with_id(ptr) : 0) {}
+
+ void operator=(const TrackedIntPtr &rhs) {
+ TrackedIntPtr o(rhs.ptr);
+ swap(o);
+ }
+ T &operator*() {
+ return *ptr;
+ }
+ T *operator->() {
+ return ptr;
+ }
+ bool operator<(const TrackedIntPtr &lhs) const {
+ return ptr < lhs.ptr;
+ }
+ bool operator==(const TrackedIntPtr &lhs) const {
+ return ptr == lhs.ptr;
+ }
+};
+
+#endif