15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/proxy/resource_reply_thread_registrar.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/logging.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ipc/ipc_message.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ppapi/proxy/resource_message_params.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/tracked_callback.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace ppapi { 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace proxy { 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ResourceReplyThreadRegistrar::ResourceReplyThreadRegistrar( 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<base::MessageLoopProxy> main_thread) 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : main_thread_(main_thread) { 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ResourceReplyThreadRegistrar::~ResourceReplyThreadRegistrar() { 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ResourceReplyThreadRegistrar::Register( 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_Resource resource, 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32_t sequence_number, 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<TrackedCallback> reply_thread_hint) { 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProxyLock::AssertAcquiredDebugOnly(); 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Use the main thread if |reply_thread_hint| is NULL or blocking. 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!reply_thread_hint.get() || reply_thread_hint->is_blocking()) 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(reply_thread_hint->target_loop()); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> reply_thread( 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reply_thread_hint->target_loop()->GetMessageLoopProxy()); 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::AutoLock auto_lock(lock_); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (reply_thread.get() == main_thread_.get()) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) map_[resource][sequence_number] = reply_thread; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ResourceReplyThreadRegistrar::Unregister(PP_Resource resource) { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::AutoLock auto_lock(lock_); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) map_.erase(resource); 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourceReplyThreadRegistrar::HandleOnIOThread(uint32 nested_msg_type) { 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::AutoLock auto_lock(lock_); 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci io_thread_message_types_.insert(nested_msg_type); 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_refptr<base::MessageLoopProxy> 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourceReplyThreadRegistrar::GetTargetThread( 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ResourceMessageReplyParams& reply_params, 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const IPC::Message& nested_msg) { 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::AutoLock auto_lock(lock_); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourceMap::iterator resource_iter = map_.find(reply_params.pp_resource()); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (resource_iter != map_.end()) { 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SequenceThreadMap::iterator sequence_thread_iter = 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_iter->second.find(reply_params.sequence()); 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (sequence_thread_iter != resource_iter->second.end()) { 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<base::MessageLoopProxy> target = 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sequence_thread_iter->second; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_iter->second.erase(sequence_thread_iter); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return target; 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (io_thread_message_types_.count(nested_msg.type()) != 0) 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_refptr<base::MessageLoopProxy>(); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return main_thread_; 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace proxy 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace ppapi 83