1 // Copyright 2013 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 #include "ppapi/proxy/resource_reply_thread_registrar.h" 6 7 #include "base/logging.h" 8 #include "base/message_loop/message_loop_proxy.h" 9 #include "ppapi/shared_impl/proxy_lock.h" 10 #include "ppapi/shared_impl/tracked_callback.h" 11 12 namespace ppapi { 13 namespace proxy { 14 ResourceReplyThreadRegistrar(scoped_refptr<base::MessageLoopProxy> default_thread)15ResourceReplyThreadRegistrar::ResourceReplyThreadRegistrar( 16 scoped_refptr<base::MessageLoopProxy> default_thread) 17 : default_thread_(default_thread) { 18 } 19 ~ResourceReplyThreadRegistrar()20ResourceReplyThreadRegistrar::~ResourceReplyThreadRegistrar() { 21 } 22 Register(PP_Resource resource,int32_t sequence_number,scoped_refptr<TrackedCallback> reply_thread_hint)23void ResourceReplyThreadRegistrar::Register( 24 PP_Resource resource, 25 int32_t sequence_number, 26 scoped_refptr<TrackedCallback> reply_thread_hint) { 27 ProxyLock::AssertAcquiredDebugOnly(); 28 29 // Use the default thread if |reply_thread_hint| is NULL or blocking. 30 if (!reply_thread_hint || reply_thread_hint->is_blocking()) 31 return; 32 33 DCHECK(reply_thread_hint->target_loop()); 34 scoped_refptr<base::MessageLoopProxy> reply_thread( 35 reply_thread_hint->target_loop()->GetMessageLoopProxy()); 36 { 37 base::AutoLock auto_lock(lock_); 38 39 if (reply_thread == default_thread_) 40 return; 41 42 map_[resource][sequence_number] = reply_thread; 43 } 44 } 45 Unregister(PP_Resource resource)46void ResourceReplyThreadRegistrar::Unregister(PP_Resource resource) { 47 base::AutoLock auto_lock(lock_); 48 map_.erase(resource); 49 } 50 51 scoped_refptr<base::MessageLoopProxy> GetTargetThreadAndUnregister(PP_Resource resource,int32_t sequence_number)52ResourceReplyThreadRegistrar::GetTargetThreadAndUnregister( 53 PP_Resource resource, 54 int32_t sequence_number) { 55 base::AutoLock auto_lock(lock_); 56 ResourceMap::iterator resource_iter = map_.find(resource); 57 if (resource_iter == map_.end()) 58 return default_thread_; 59 60 SequenceNumberMap::iterator sequence_number_iter = 61 resource_iter->second.find(sequence_number); 62 if (sequence_number_iter == resource_iter->second.end()) 63 return default_thread_; 64 65 scoped_refptr<base::MessageLoopProxy> target = sequence_number_iter->second; 66 resource_iter->second.erase(sequence_number_iter); 67 return target; 68 } 69 70 } // namespace proxy 71 } // namespace ppapi 72