Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Side by Side Diff: mojo/common/weak_binding_set.h

Issue 1049993002: Get mojo_shell building inside chromium checkout. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix presubmit Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « mojo/common/tracing_impl.cc ('k') | mojo/common/weak_interface_ptr_set.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef MOJO_COMMON_WEAK_BINDING_SET_H_
6 #define MOJO_COMMON_WEAK_BINDING_SET_H_
7
8 #include <algorithm>
9 #include <vector>
10
11 #include "base/memory/weak_ptr.h"
12 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h"
13
14 namespace mojo {
15
16 template <typename Interface>
17 class WeakBinding;
18
19 // Use this class to manage a set of weak pointers to bindings each of which is
20 // owned by the pipe they are bound to.
21 template <typename Interface>
22 class WeakBindingSet : public ErrorHandler {
23 public:
24 WeakBindingSet() : error_handler_(nullptr) {}
25 ~WeakBindingSet() { CloseAllBindings(); }
26
27 void set_error_handler(ErrorHandler* error_handler) {
28 error_handler_ = error_handler;
29 }
30
31 void AddBinding(Interface* impl, InterfaceRequest<Interface> request) {
32 auto binding = new WeakBinding<Interface>(impl, request.Pass());
33 binding->set_error_handler(this);
34 bindings_.push_back(binding->GetWeakPtr());
35 }
36
37 void CloseAllBindings() {
38 for (const auto& it : bindings_) {
39 if (it)
40 it->Close();
41 }
42 bindings_.clear();
43 }
44
45 private:
46 // ErrorHandler implementation.
47 void OnConnectionError() override {
48 // Clear any deleted bindings.
49 bindings_.erase(
50 std::remove_if(bindings_.begin(), bindings_.end(),
51 [](const base::WeakPtr<WeakBinding<Interface>>& p) {
52 return p.get() == nullptr;
53 }),
54 bindings_.end());
55
56 if (error_handler_)
57 error_handler_->OnConnectionError();
58 }
59
60 ErrorHandler* error_handler_;
61 std::vector<base::WeakPtr<WeakBinding<Interface>>> bindings_;
62
63 DISALLOW_COPY_AND_ASSIGN(WeakBindingSet);
64 };
65
66 template <typename Interface>
67 class WeakBinding : public ErrorHandler {
68 public:
69 WeakBinding(Interface* impl, InterfaceRequest<Interface> request)
70 : binding_(impl, request.Pass()),
71 error_handler_(nullptr),
72 weak_ptr_factory_(this) {
73 binding_.set_error_handler(this);
74 }
75
76 ~WeakBinding() override {}
77
78 void set_error_handler(ErrorHandler* error_handler) {
79 error_handler_ = error_handler;
80 }
81
82 base::WeakPtr<WeakBinding> GetWeakPtr() {
83 return weak_ptr_factory_.GetWeakPtr();
84 }
85
86 void Close() { binding_.Close(); }
87
88 // ErrorHandler implementation.
89 void OnConnectionError() override {
90 ErrorHandler* error_handler = error_handler_;
91 delete this;
92 if (error_handler)
93 error_handler->OnConnectionError();
94 }
95
96 private:
97 mojo::Binding<Interface> binding_;
98 ErrorHandler* error_handler_;
99 base::WeakPtrFactory<WeakBinding> weak_ptr_factory_;
100
101 DISALLOW_COPY_AND_ASSIGN(WeakBinding);
102 };
103
104 } // namespace mojo
105
106 #endif // MOJO_COMMON_WEAK_BINDING_SET_H_
OLDNEW
« no previous file with comments | « mojo/common/tracing_impl.cc ('k') | mojo/common/weak_interface_ptr_set.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698