1f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//
2f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//  Copyright (C) 2015 Google, Inc.
3f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//
4f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//  Licensed under the Apache License, Version 2.0 (the "License");
5f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//  you may not use this file except in compliance with the License.
6f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//  You may obtain a copy of the License at:
7f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//
8f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//  http://www.apache.org/licenses/LICENSE-2.0
9f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//
10f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//  Unless required by applicable law or agreed to in writing, software
11f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//  distributed under the License is distributed on an "AS IS" BASIS,
12f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//  See the License for the specific language governing permissions and
14f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//  limitations under the License.
15f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//
16f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
17f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray#pragma once
18f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
19f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray#include <mutex>
20f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray#include <unordered_map>
21f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
22f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray#include <base/logging.h>
23f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray#include <base/macros.h>
24f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray#include <binder/IBinder.h>
25f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray#include <binder/IInterface.h>
26f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
27f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraynamespace ipc {
28f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraynamespace binder {
29f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
30f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray// A map of remote interfaces where the value type "V" must inherit from
31f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray// android::IInterface. This is just like RemoteCallbackList except it provides
32f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray// a key-value mapping.
33f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray//
34f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray// TODO(armansito): We should make this class non-final and the template
35f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray// interface abstract, so that code that depends on this can be unit tested
36f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray// against a mock version of this class.
37f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraytemplate<typename K, typename V>
38f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Ugurayclass RemoteCallbackMap final {
39f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray public:
40f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  RemoteCallbackMap() = default;
41f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  ~RemoteCallbackMap();
42f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
43f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // The Delegate interface is used to notify when a registered callback is
44f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // removed from the map as a result of the death of the remote process that
45f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // owns the registered callback.
46f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  class Delegate {
47f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray   public:
48f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    virtual ~Delegate() = default;
49f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
50f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    // Called when a remote callback associated with the key |key| has been
51f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    // removed. This won't get called if the callback was removed as a result of
52f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    // a call to RemoteCallbackMap::Unregister.
53f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    virtual void OnRemoteCallbackRemoved(const K& key) = 0;
54f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  };
55f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
56f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // Register a callback interface and associate it with the given key.
57f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // Registering will automatically start tracking for death notifications in
58f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // case the remote process hosting the Binder dies. In such a case, the Binder
59f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // is automatically removed from the map.
60f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  //
61f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // An optional |delegate| can be passed which will be assocated with the given
62f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // key/value pair. |delegate| must outlive this map.
63f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  bool Register(const K& key,
64f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray                const android::sp<V>& callback,
65f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray                Delegate* delegate = nullptr);
66f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
67f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // Unregisters a previously registered callback with the given key. Returns
68f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // false if |key| doesn't exist.
69f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  bool Unregister(const K& key);
70f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
71f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // Returns the callback associated with the given key. Returns NULL if |key|
72f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // doesn't exist.
73f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  android::sp<V> Get(const K& key);
74f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
75f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // Removes the callback associated with the given key from the map and returns
76f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // the value. Returns NULL if the key doesn't exists.
77f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  android::sp<V> Remove(const K& key);
78f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
79f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // Clear the contents of the map.
80f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  void Clear();
81f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
82f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray private:
83f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  class CallbackDeathRecipient : public android::IBinder::DeathRecipient {
84f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray   public:
85f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    CallbackDeathRecipient(
86f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray        const K& key,
87f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray        const android::sp<V>& callback,
88f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray        RemoteCallbackMap<K, V>* owner,
89f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray        Delegate* delegate);
90f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
91f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    android::sp<V> get_callback() const { return callback_; }
92f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
93f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    // android::IBinder::DeathRecipient override:
94f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    void binderDied(const android::wp<android::IBinder>& who) override;
95f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
96f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray   private:
97f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    K key_;
98f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    android::sp<V> callback_;
99f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    RemoteCallbackMap<K, V>* owner_;  // weak
100f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    Delegate* delegate_;  // weak
101f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  };
102f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
103f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // Typedef for internal map container.
104f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  using CallbackMap =
105f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray      std::unordered_map<K, android::sp<CallbackDeathRecipient>>;
106f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
107f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  bool UnregisterInternal(typename CallbackMap::iterator iter);
108f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
109f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  std::mutex map_lock_;
110f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  CallbackMap map_;
111f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
112f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  DISALLOW_COPY_AND_ASSIGN(RemoteCallbackMap);
113f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray};
114f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
115f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray// Template Implementation details below
116f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray// ========================================================
117f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
118f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Ugurayusing android::IBinder;
119f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Ugurayusing android::IInterface;
120f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Ugurayusing android::sp;
121f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Ugurayusing android::wp;
122f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Ugurayusing std::lock_guard;
123f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Ugurayusing std::mutex;
124f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
125f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraytemplate<typename K, typename V>
126f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman UgurayRemoteCallbackMap<K, V>::~RemoteCallbackMap() {
127f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  Clear();
128f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray}
129f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
130f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraytemplate<typename K, typename V>
131f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraybool RemoteCallbackMap<K, V>::Register(
132f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    const K& key,
133f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    const sp<V>& callback,
134f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    Delegate* delegate) {
135f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  lock_guard<mutex> lock(map_lock_);
136f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
137f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  if (map_.find(key) != map_.end()) {
138f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    VLOG(1) << "Callback map already contains key";
139f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    return false;
140f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  }
141f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
142f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  sp<CallbackDeathRecipient> dr(
143f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray      new CallbackDeathRecipient(key, callback, this, delegate));
144f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  sp<IBinder> binder = IInterface::asBinder(callback.get());
145f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  if (binder->linkToDeath(dr) != android::NO_ERROR) {
146f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    LOG(ERROR) << "Failed to link death recipient to binder";
147f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    return false;
148f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  }
149f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
150f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  map_[key] = dr;
151f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
152f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  VLOG(2) << "Callback successfully registered with map";
153f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
154f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  return true;
155f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray}
156f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
157f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraytemplate<typename K, typename V>
158f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraybool RemoteCallbackMap<K, V>::Unregister(const K& key) {
159f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  lock_guard<mutex> lock(map_lock_);
160f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
161f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  auto iter = map_.find(key);
162f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  if (iter == map_.end()) {
163f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    VLOG(1) << "Callback with given key not found";
164f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    return false;
165f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  }
166f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
167f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  return UnregisterInternal(iter);
168f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray}
169f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
170f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraytemplate<typename K, typename V>
171f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraysp<V> RemoteCallbackMap<K, V>::Get(const K& key) {
172f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  lock_guard<mutex> lock(map_lock_);
173f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
174f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  auto iter = map_.find(key);
175f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  if (iter == map_.end())
176f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    return nullptr;
177f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
178b2b1ecd3c282412773f5ca70ee2798542bc2920fArman Uguray  return iter->second->get_callback();
179f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray}
180f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
181f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraytemplate<typename K, typename V>
182f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraysp<V> RemoteCallbackMap<K, V>::Remove(const K& key) {
183f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  lock_guard<mutex> lock(map_lock_);
184f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
185f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  auto iter = map_.find(key);
186f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  if (iter == map_.end())
187f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    return nullptr;
188f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
189f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  sp<V> val = iter->second->get_callback();
190f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  UnregisterInternal(iter);
191f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
192f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  return val;
193f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray}
194f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraytemplate<typename K, typename V>
195f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Ugurayvoid RemoteCallbackMap<K, V>::Clear() {
196f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  lock_guard<mutex> lock(map_lock_);
197f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
198f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  for (auto iter = map_.begin(); iter != map_.end();)
199f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    UnregisterInternal(iter++);
200f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray}
201f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
202f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraytemplate<typename K, typename V>
203f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraybool RemoteCallbackMap<K, V>::UnregisterInternal(
204f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    typename CallbackMap::iterator iter) {
205f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  sp<CallbackDeathRecipient> dr = iter->second;
206f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  map_.erase(iter);
207f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
208f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  if (IInterface::asBinder(dr->get_callback().get())->unlinkToDeath(dr) !=
209f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray      android::NO_ERROR) {
210f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    LOG(ERROR) << "Failed to unlink death recipient from binder";
211f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
212f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    // We removed the entry from |map_| but unlinkToDeath failed. There isn't
213f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    // really much we can do here other than deleting the binder and returning
214f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    // an error.
215f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    return false;
216f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  }
217f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
218f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  VLOG(2) << "Callback successfully removed from map";
219f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
220f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  return true;
221f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray}
222f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
223f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraytemplate<typename K, typename V>
224f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman UgurayRemoteCallbackMap<K, V>::CallbackDeathRecipient::CallbackDeathRecipient(
225f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    const K& key,
226f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    const sp<V>& callback,
227f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    RemoteCallbackMap<K, V>* owner,
228f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    Delegate* delegate)
229f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    : key_(key),
230f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray      callback_(callback),
231f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray      owner_(owner),
232f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray      delegate_(delegate) {
233f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  CHECK(callback_.get());
234f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray}
235f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
236f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguraytemplate<typename K, typename V>
237f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Ugurayvoid RemoteCallbackMap<K, V>::CallbackDeathRecipient::binderDied(
238f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    const wp<IBinder>& who) {
239f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  VLOG(1) << "Received binderDied";
240f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
241f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  sp<IBinder> binder = IInterface::asBinder(callback_.get());
242f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  CHECK(who.unsafe_get() == binder.get());
243f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
244f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // Remove the callback but no need to call unlinkToDeath.
245f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  {
246f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    lock_guard<mutex> lock(owner_->map_lock_);
247f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    auto iter = owner_->map_.find(key_);
248f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    CHECK(iter != owner_->map_.end());
249f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    owner_->map_.erase(iter);
250f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  }
251f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
252f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  VLOG(1) << "Callback from dead process unregistered; notifying delegate";
253f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
254f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  // Notify delegate.
255f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray  if (delegate_)
256f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray    delegate_->OnRemoteCallbackRemoved(key_);
257f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray}
258f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray
259f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray}  // namespace binder
260f8711f2e95343f2c9673ab4ffc0bebbdba16c452Arman Uguray}  // namespace ipc
261