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" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/proxy_lock.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/tracked_callback.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace ppapi { 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace proxy { 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ResourceReplyThreadRegistrar::ResourceReplyThreadRegistrar( 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> default_thread) 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : default_thread_(default_thread) { 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ResourceReplyThreadRegistrar::~ResourceReplyThreadRegistrar() { 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ResourceReplyThreadRegistrar::Register( 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_Resource resource, 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32_t sequence_number, 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<TrackedCallback> reply_thread_hint) { 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ProxyLock::AssertAcquiredDebugOnly(); 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Use the default thread if |reply_thread_hint| is NULL or blocking. 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!reply_thread_hint || reply_thread_hint->is_blocking()) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(reply_thread_hint->target_loop()); 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> reply_thread( 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reply_thread_hint->target_loop()->GetMessageLoopProxy()); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::AutoLock auto_lock(lock_); 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (reply_thread == default_thread_) 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) map_[resource][sequence_number] = reply_thread; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ResourceReplyThreadRegistrar::Unregister(PP_Resource resource) { 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::AutoLock auto_lock(lock_); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) map_.erase(resource); 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_refptr<base::MessageLoopProxy> 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ResourceReplyThreadRegistrar::GetTargetThreadAndUnregister( 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PP_Resource resource, 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32_t sequence_number) { 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::AutoLock auto_lock(lock_); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceMap::iterator resource_iter = map_.find(resource); 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (resource_iter == map_.end()) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return default_thread_; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SequenceNumberMap::iterator sequence_number_iter = 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resource_iter->second.find(sequence_number); 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (sequence_number_iter == resource_iter->second.end()) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return default_thread_; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> target = sequence_number_iter->second; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resource_iter->second.erase(sequence_number_iter); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return target; 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace proxy 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace ppapi 72