Index: mojo/public/cpp/bindings/lib/destruction_tracker.cc |
diff --git a/mojo/public/cpp/bindings/lib/destruction_tracker.cc b/mojo/public/cpp/bindings/lib/destruction_tracker.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9abfa11bc3c0d0fb296b67178e0fa3bba24e45b3 |
--- /dev/null |
+++ b/mojo/public/cpp/bindings/lib/destruction_tracker.cc |
@@ -0,0 +1,37 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "mojo/public/cpp/bindings/lib/destruction_tracker.h" |
+ |
+namespace mojo { |
+ |
+DestructionTracker::Flag::Flag(DestructionTracker* tracker) |
+ : tracker_(tracker), outer_flag_(tracker->flag_) { |
+ tracker_->SetFlag(this); |
+} |
+ |
+DestructionTracker::Flag::~Flag() { |
+ if (tracker_) |
+ tracker_->SetFlag(outer_flag_); |
+} |
+ |
+void DestructionTracker::Flag::NotifyDestroyed() { |
+ was_destroyed_ = true; |
+ tracker_ = nullptr; |
+ if (outer_flag_) |
+ outer_flag_->NotifyDestroyed(); |
+} |
+ |
+DestructionTracker::DestructionTracker() = default; |
+ |
+DestructionTracker::~DestructionTracker() { |
+ if (flag_) |
+ flag_->NotifyDestroyed(); |
+} |
+ |
+void DestructionTracker::SetFlag(Flag* flag) { |
+ flag_ = flag; |
+} |
+ |
+} // namespace mojo |