OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/android/java/gin_java_bridge_dispatcher_host.h" | 5 #include "content/browser/android/java/gin_java_bridge_dispatcher_host.h" |
6 | 6 |
7 #include "base/android/java_handler_thread.h" | 7 #include "base/android/java_handler_thread.h" |
8 #include "base/android/jni_android.h" | 8 #include "base/android/jni_android.h" |
9 #include "base/android/scoped_java_ref.h" | 9 #include "base/android/scoped_java_ref.h" |
10 #include "base/atomic_sequence_num.h" | 10 #include "base/atomic_sequence_num.h" |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 return JavaObjectWeakGlobalRef(); | 184 return JavaObjectWeakGlobalRef(); |
185 } | 185 } |
186 | 186 |
187 JavaObjectWeakGlobalRef | 187 JavaObjectWeakGlobalRef |
188 GinJavaBridgeDispatcherHost::RemoveHolderAndAdvanceLocked( | 188 GinJavaBridgeDispatcherHost::RemoveHolderAndAdvanceLocked( |
189 int32 holder, | 189 int32 holder, |
190 ObjectMap::iterator* iter_ptr) { | 190 ObjectMap::iterator* iter_ptr) { |
191 objects_lock_.AssertAcquired(); | 191 objects_lock_.AssertAcquired(); |
192 JavaObjectWeakGlobalRef result; | 192 JavaObjectWeakGlobalRef result; |
193 scoped_refptr<GinJavaBoundObject> object((*iter_ptr)->second); | 193 scoped_refptr<GinJavaBoundObject> object((*iter_ptr)->second); |
| 194 bool object_erased = false; |
194 if (!object->IsNamed()) { | 195 if (!object->IsNamed()) { |
195 object->RemoveHolder(holder); | 196 object->RemoveHolder(holder); |
196 if (!object->HasHolders()) { | 197 if (!object->HasHolders()) { |
197 result = object->GetWeakRef(); | 198 result = object->GetWeakRef(); |
198 objects_.erase((*iter_ptr)++); | 199 objects_.erase((*iter_ptr)++); |
| 200 object_erased = true; |
199 } | 201 } |
200 } else { | 202 } |
| 203 if (!object_erased) { |
201 ++(*iter_ptr); | 204 ++(*iter_ptr); |
202 } | 205 } |
203 return result; | 206 return result; |
204 } | 207 } |
205 | 208 |
206 void GinJavaBridgeDispatcherHost::RemoveFromRetainedObjectSetLocked( | 209 void GinJavaBridgeDispatcherHost::RemoveFromRetainedObjectSetLocked( |
207 const JavaObjectWeakGlobalRef& ref) { | 210 const JavaObjectWeakGlobalRef& ref) { |
208 objects_lock_.AssertAcquired(); | 211 objects_lock_.AssertAcquired(); |
209 JNIEnv* env = base::android::AttachCurrentThread(); | 212 JNIEnv* env = base::android::AttachCurrentThread(); |
210 base::android::ScopedJavaLocalRef<jobject> retained_object_set = | 213 base::android::ScopedJavaLocalRef<jobject> retained_object_set = |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 if (iter == objects_.end()) | 482 if (iter == objects_.end()) |
480 return; | 483 return; |
481 JavaObjectWeakGlobalRef ref = | 484 JavaObjectWeakGlobalRef ref = |
482 RemoveHolderAndAdvanceLocked(GetCurrentRoutingID(), &iter); | 485 RemoveHolderAndAdvanceLocked(GetCurrentRoutingID(), &iter); |
483 if (!ref.is_empty()) { | 486 if (!ref.is_empty()) { |
484 RemoveFromRetainedObjectSetLocked(ref); | 487 RemoveFromRetainedObjectSetLocked(ref); |
485 } | 488 } |
486 } | 489 } |
487 | 490 |
488 } // namespace content | 491 } // namespace content |
OLD | NEW |